如何将 DAO 查询转换为 Yii2 ActiveRecord。如何从连接表中选择和使用特定列

Posted

技术标签:

【中文标题】如何将 DAO 查询转换为 Yii2 ActiveRecord。如何从连接表中选择和使用特定列【英文标题】:How to translate DAO query into Yii2 ActiveRecord. How to select and use specific columns from joined table 【发布时间】:2015-07-30 01:29:10 【问题描述】:

我在我的项目中使用 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) 我需要像你在 DAO 版本中看到的那样应用 GROUP BY 和 ORDER BY。

4) clubOffer 是与表 club_offer 的关系,但我没有从中选择任何东西,除了我在 DAO 中使用它来加入。

5) clubTerritories 是 club_offer 表与 club_territories 表的关系。我需要它用于查询的 WHERE 部分。

我做错了什么?急切的加载给了我更好的性能,但我不明白我是否可以像使用 JOIN 一样用它做同样的事情。你能帮我们解决这个问题吗?我想使用 AR,但我很难将 DAO“翻译”成 AR。谢谢

【问题讨论】:

【参考方案1】:

问题是:您使用的Query->with() 方法不是连接的别名 - 如果您想按相关表属性过滤结果,您仍必须使用join()with 方法仅创建额外的数据库请求并将结果填充/添加为 AR 关系模型。如果您仍然需要所有的 AR,包括结果中的关系,您可以使用 join 进行过滤,使用 with 来附加关系。

【讨论】:

以上是关于如何将 DAO 查询转换为 Yii2 ActiveRecord。如何从连接表中选择和使用特定列的主要内容,如果未能解决你的问题,请参考以下文章

Yii2中DAO

Yii2 : Active Record 添加 Not In 条件

yii2数据库操作DAO

Yii2之Active Record

Yii2 查询构建器 QueryBuilder

如何将mysql中的select语句转换为java中的查询?