如何用Yii Query Builder编写SQL查询

ve7v8dk2  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(101)

我有这个SQL查询,它正在执行我想要的操作:

SELECT `Table1`.* FROM `Table1` 
LEFT JOIN `Table2` ON `Table1`.`idTable2` = `Table2`.`id` 
WHERE (`Table1`.`idOwner`=156 AND `Table2`.`enabled`=1 AND day(Table2.creationDate) <= 5 AND date_format(Table2.creationDate, '%Y-%m') = '2022-12') 
OR (`Table1`.`idOwner`=156 AND `Table2`.`enabled`=1 AND date_format(Table2.creationDate, '%Y-%m') != '2023-01' AND date_format(Table2.creationDate, '%Y-%m') != '2022-12')

我试着把它复制成一个Yii Query Builder,如下所示:

Table1::find()
   ->joinWith(['table2'])
   ->where(['Table1.idOwner' => $idOwner, 'Table2.enabled' => 1])
   ->andWhere(['<=', 'day(Table2.creationDate)', $expirationDay])
   ->andWhere(['=', "date_format(Table2.creationDate, '%Y-%m')", $previousExpirationMonthYear])
   ->orWhere(['Table1.idOwner' => $idOwner, 'Table2.enabled' => 1])
   ->andWhere(['!=', "date_format(Table2.creationDate, '%Y-%m')", $currentExpirationMonthYear])
   ->andWhere(['!=', "date_format(Table2.creationDate, '%Y-%m')", $previousExpirationMonthYear])
   ->all();

但我打印了这个查询生成器使用getRawSql()生成的SQL,它以这种奇怪的方式返回:

SELECT `Table1`.* FROM `Table1` 
LEFT JOIN `Table2` ON `Table1`.`idTable2` = `Table2`.`id` 
WHERE (((((((`Table1`.`idOwner`=156) 
AND (`Table2`.`enabled`=1)) 
AND (day(Table2.creationDate) <= 5)) 
AND (date_format(Table2.creationDate, '%Y-%m') = '2022-12')) 
OR ((`Table1`.`idOwner`=156) 
AND (`Table2`.`enabled`=1))) 
AND (date_format(Table2.creationDate, '%Y-%m') != '2023-01')) 
AND (date_format(Table2.creationDate, '%Y-%m') != '2022-12')) 
AND (`Table1`.`idOwner`='156')

抱歉,如果很难这样读的话。
有人能帮助我使查询构建器喜欢我想要的方式吗?我将非常感激

vjhs03f7

vjhs03f71#

无论何时使用andWhere()orWhere(),查询生成器都会采用现有条件,并执行如下操作:
(现有条件)AND(新条件)

(现有条件)OR(新条件)
分别为。
所以如果你已经有了一些复杂的条件,然后你试图调用

orWhere(new condition 1)
->andWhere(new condition 2)

你会得到
((复杂条件)OR(新条件1))AND(新条件2)。
但在您的情况下,您需要获得类似于以下内容的内容:
(复杂条件1)OR(复杂条件2)
要得到类似的结果,你可以用同样的方法构建第一个复杂条件,但是你必须在一个orWhere()调用中构建第二个条件。或者,为了使它更容易阅读,你可以在一个调用中构建两个复杂条件:

Table1::find()
    ->joinWith(['table2'])
    ->where([
        'AND',
        ['Table1.idOwner' => $idOwner, 'Table2.enabled' => 1],
        ['<=', 'day(Table2.creationDate)', $expirationDay],
        ['=', "date_format(Table2.creationDate, '%Y-%m')", $previousExpirationMonthYear]
    ])->orWhere([
        'AND',
        ['Table1.idOwner' => $idOwner, 'Table2.enabled' => 1],
        ['!=', "date_format(Table2.creationDate, '%Y-%m')", $currentExpirationMonthYear],
        ['!=', "date_format(Table2.creationDate, '%Y-%m')", $previousExpirationMonthYear]
    ])->all();

相关问题