Yii2 запрос

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
sergeysykt
Сообщения: 1
Зарегистрирован: 2018.05.07, 15:30

Yii2 запрос

Сообщение sergeysykt »

Не так давно начал изучать Yii2, столкнулся с проблемкой

Есть 3 таблицы (Связь многие ко многим).
Т.е есть товар и ингредиенты предположим и их связывает общая таблица.
В моделях прописал ...hasMany...->viaTable.... (соединил с связующей таблицей).

В контроллер приходит примерный запрос:
site.ru/category/type/ingr
Как выбрать все id пирогов, у которых ingr = (то что пользователю надо)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Yii2 запрос

Сообщение samdark »

А как бы вы сделали это в SQL?
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Yii2 запрос

Сообщение Alexum »

Если заходить со стороны пирогов, то массив пирогов можно получить следующим образом:

Код: Выделить всё

// pieFilling -> связь через промежуточную таблицу, описанная в методе getPieFilling() модели Pie
$meatPies= Pie::find()->joinWith(['pieFilling'])->andWhere(['filling_name' => 'meat'])->all();
В данном случае обязательно используется joinWith, жадная загрузка.

Или можно зайти с другой стороны и создать связь в модели ингридиентов от ингридиентов к пирогам. Например, если известен id начинки, можно вытащить привязанные к ней пироги.

Код: Выделить всё

// Находим начинку и через связь подцепляем пироги
$filling = Filling::find()->with('piesWithFilling')->andWhere(['filling_id' => 15])->one();

if(!empty($filling->piesWithFilling)){
    //$pies - массив с объектами пирогами
    $pies = $filling->piesWithFilling;
}
При такой схеме сперва из Бд будет подтянута модель начинки, затем через связанную таблицу найдены все пироги с такой начинкой и подтянуты отдельным запросом по массиву ID пирогов.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Yii2 запрос

Сообщение andku83 »

Alexum писал(а): 2018.05.08, 11:55 ...
В данном случае обязательно используется joinWith, жадная загрузка.

.
зачем? в задаче нужны были только id пирогов, связи там не нужны были.
Достаточно:

Код: Выделить всё

->joinWith(['pieFilling'], false)
Ответить