2015-05-18 21 views
2

我正在为我的项目使用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。谢谢

回答

1

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

相关问题