我正在为我的项目使用Yii2。我需要将这个DAO查询翻译成ActiveRecord。让我先告诉你我的DAO查询,然后尝试使用Active Record,然后指定我想要做的事情。我相信,一旦你看到DAO版本,一切都将清晰可见。如何将DAO查询翻译成Yii2 ActiveRecord。如何从连接表中选择和使用特定列
下面是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)clubTerritory是club_offer表与club_territories表的关系。我需要它的WHERE部分的查询。
我做错了什么?急切的加载使我获得了更好的性能,但我不明白我是否可以像使用JOIN一样执行相同的操作。你能帮助我们解决这个问题吗?我想使用AR,但我很难将DAO“翻译”为AR。谢谢