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