Как перевести DAO-запрос в Yii2 ActiveRecord. Как выбрать и использовать определенные столбцы из объединенной таблицы

Я использую Yii2 для своего проекта. Мне нужно «перевести» этот DAO-запрос в ActiveRecord. Позвольте мне сначала показать вам мой запрос DAO, а затем мою попытку с Active Record, а затем я укажу, что я пытаюсь сделать. Я верю, что вам все станет ясно, как только вы увидите версию DAO.

Вот версия DAO:

return $db->createCommand("SELECT c.id, c.naziv, c.naziv_bih, c.naziv_hr, c.illustration_url,
coc.cpv_id, COUNT(coc.club_offer_id) AS offersCount, TRIM(TRAILING '0' FROM c.id) AS cpvRoot

FROM club_offer_cpv coc

JOIN cpv c ON coc.cpv_id = c.id

JOIN club_offer co ON coc.club_offer_id = co.id

JOIN club_territories ct ON co.club_id = ct.club_id

WHERE ct.teritorije_id = $territory_id

GROUP BY c.id

ORDER BY offersCount DESC

LIMIT 9 ;

")->queryAll();

И это моя попытка с AR:

return self::find()->select("cpv_id, COUNT(club_offer_id) AS offersCount, TRIM(TRAILING '0' FROM cpv_id) AS cpvRoot")

->with([
'cpv',
'clubOffer',
'clubOffer.clubTerritories' => function ($query) {
$query->andWhere("teritorije_id = $territory_id");
},
])
->groupBy(['cpv_id'])
->limit(9)
->orderBy(['offersCount' => SORT_DESC])
->all();

1) Этот запрос выберет * из таблицы cpv, и я хочу только определенные столбцы: c.id, c.naziv, c.naziv_bih, c.naziv_hr, c.illustration_url,

2) Мне нужно применить это условие WHERE ct.teritorije_id = $territory_id, Вы можете видеть, как я пытался написать это в AR, но это не работает, если я смотрю на отладчик, это условие вообще не в запросе.

3) Мне нужно применить GROUP BY и ORDER BY, как вы видите в версии DAO.

4) clubOffer — это связь с таблицей club_offer, но я ничего не выбираю из нее, кроме того, что я использую ее в DAO для присоединения.

5) clubTerritories — это отношение таблицы club_offer к таблице club_territories. Мне это нужно для ГДЕ части запроса.

Что я делаю не так? Стремительная загрузка дает мне лучшую производительность, но я не понимаю, могу ли я делать с ней те же вещи, что и с JOIN. Можете ли вы помочь нам с этой проблемой? Я хотел бы использовать AR, но мне трудно «переводить» DAO в AR. Спасибо

2

Решение

Проблема в: Query->with() метод, который вы используете, не является псевдонимом для соединения — вы все равно должны использовать join() если вы хотите отфильтровать результаты по атрибуту связанных таблиц. with Метод только создает дополнительные запросы БД и заполняет / добавляет результаты в виде моделей отношений AR. Если вам все еще нужны все ваши AR, включая отношения в результатах, вы можете использовать join для фильтрации и with для прикрепления отношений обоих.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]