如何在Yii2中创建复杂的左外连接?

时间:2015-06-19 01:54:22

标签: php activerecord orm yii2

如何在Yii2中执行此查询?

SELECT `keyword`.`id`, `keyword`, `volume`, `cpc`, `competition`, `keyword_id` 
FROM `keyword` 
LEFT JOIN `ad_group_keyword` 
  ON keyword.id = ad_group_keyword.keyword_id 
  and ad_group_id = 1 
WHERE ((`keyword_id` IS NULL) 
  AND (NOT (`volume` IS NULL))) 
  AND (NOT (`cpc` IS NULL)) 
ORDER BY volume desc 
LIMIT 1;

我尝试了以下和许多组合,但我无法使ON部分正确。

$kw = Keyword::find()->select(['keyword.id', 'keyword', 'volume', 'cpc', 'competition', 'keyword_id'])->
  leftJoin('ad_group_keyword', 'keyword.id = ad_group_keyword.keyword_id', ['ad_group_id'=>1])->
  andWhere(['keyword_id'=>null])->
  andWhere(['not', ['volume' => null]])->andWhere(['not', ['cpc' => null]])->
  orderBy('volume desc')->asArray()->limit(1)->all();

上面生成了这个SQL,它缺少ON的第二个条件:

  

SELECT keywordidkeywordvolumecpccompetitionkeyword_id FROM {{1} } LEFT JOIN keyword ON keyword.id = ad_group_keyword.keyword_id WHERE((ad_group_keyword IS NULL)AND(NOT(keyword_id IS NULL)))AND(NOT volume IS NULL))ORDER BY cpc desc LIMIT 1

我也试过

volume

但它会生成

  

FROM leftJoin('ad_group_keyword', ['keyword.id'=>'keyword_id', 'ad_group_id'=>1])-> LEFT JOIN keyword ON(ad_group_keywordkeyword =&#39; keyword_id&#39;)AND(id = 1)< / p>

使用&#39; keyword_id&#39;在引号中,所以它将它视为一个字符串!

文档:http://www.yiiframework.com/doc-2.0/yii-db-query.html#leftJoin()-detail

(这就是我讨厌处理ORM API的原因。我花了很多时间精通SQL。现在你让我学习了一种全新的方法来做同样的事情,有时它是不可能的。)< / p>

2 个答案:

答案 0 :(得分:2)

关于您必须处理ORM API的说法,您可以使用ActiveRecord[]方法。您可以使用此方法使用原始SQL查询。不同之处在于,您不会获得array[],而只是$sql = "SELECT `keyword`.`id`, `keyword`, `volume`, `cpc`, `competition`, `keyword_id` FROM `keyword` LEFT JOIN `ad_group_keyword` ON keyword.id = ad_group_keyword.keyword_id and ad_group_id = 1 WHERE ((`keyword_id` IS NULL) AND (NOT (`volume` IS NULL))) AND (NOT (`cpc` IS NULL)) ORDER BY volume desc LIMIT 1;"; $params = []; $kw = Yii::$app->db->createCommand($sql, $params)->queryAll(); (这对于复杂的查询通常很好)。

iloc

答案 1 :(得分:0)

leftJoin('ad_group_keyword', ['and', 'keyword.id = keyword_id', "ad_group_id = $adGroupId"])->

...啧