我有这个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')
抱歉,如果很难这样读的话。
有人能帮助我使查询构建器喜欢我想要的方式吗?我将非常感激
1条答案
按热度按时间vjhs03f71#
无论何时使用
andWhere()
或orWhere()
,查询生成器都会采用现有条件,并执行如下操作:(现有条件)AND(新条件)
或
(现有条件)OR(新条件)
分别为。
所以如果你已经有了一些复杂的条件,然后你试图调用
你会得到
((复杂条件)OR(新条件1))AND(新条件2)。
但在您的情况下,您需要获得类似于以下内容的内容:
(复杂条件1)OR(复杂条件2)
要得到类似的结果,你可以用同样的方法构建第一个复杂条件,但是你必须在一个
orWhere()
调用中构建第二个条件。或者,为了使它更容易阅读,你可以在一个调用中构建两个复杂条件: