Есть таблица groups:
group_id group_pid group_logo
Есть таблица params:
param_id param_type
И есть связующая таблица (какие параметры к каким группам принадлежат) group_params:
group_id param_id param_order
Необходимо получить все параметры для конкретной группы через таблицу group_params отсортированные по param_order.
Как я понял наболевшая тема, видел варианты на форму. Все усложняется тем, что у меня очень жирный запрос:
Код: Выделить всё
$query = Group::find()
->asArray();
$query->joinWith([
'parent' => function ($query) {
$query->from(Group::tableName() . ' pg')
->with([
't' => function ($query) {
}
]);
},
]);
$query->joinWith([
'params' => function ($query) {
$query->joinWith([
'values' => function ($query) {
$query->with('t');
},
])->with('t');
},
]);
$query->with('t')
//->status()
//->type()
->andWhere(Group::tableName() . '.group_id = :group_id', [':group_id' => $groupId]);
Обратите внимание на кол-во реляций и подреляций. Конкретно нас интересуют params.
Код: Выделить всё
public function getParams()
{
return $this->hasMany(Param::className(), ['param_id' => 'param_id'])
->viaTable(GroupParams::tableName(), ['group_id' => 'group_id'], function ($query) {
$query->orderBy(['param_order' => SORT_ASC]);
});
}
Код: Выделить всё
$result = [];
$query = Group::find()
->asArray();
$query->joinWith([
'parent' => function ($query) {
$query->from(Group::tableName() . ' pg')
->with([
't' => function ($query) {
}
]);
},
]);
$query->with('t')
//->status()
//->type()
->andWhere(Group::tableName() . '.group_id = :group_id', [':group_id' => $groupId]);
$result = $query->one();
if (isset($result['group_id'])) {
$result['params'] = Param::find()
->asArray()
->select(Param::tableName() . '.*, ' . GroupParams::tableName() . '.param_order')
->innerJoin(GroupParams::tableName(), GroupParams::tableName() . '.param_id=' . Param::tableName() . '.param_id')
->orderBy([GroupParams::tableName() . '.param_order' => SORT_ASC])
->where(GroupParams::tableName() . '.group_id = '.$result['group_id'])
->joinWith([
'values' => function ($query) {
$query->with('t');
},
])->with('t')
->all();
}
Вопрос такой, если будет форс-мажор, лаганет сервер или база, или еще что. Какие могут вообще быть последствия в таком подходе ?