我有一个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查询生成器,像这样:
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')对不起,如果很难这样读的话。
有人能帮我使查询生成器像我想要的那样吗?我将非常感谢
发布于 2022-07-08 07:19:18
无论何时使用andWhere()或orWhere(),查询生成器都会接受现有条件并执行如下操作:
(现有条件)和(新条件)
或
(现有条件)或(新条件)
分别使用。
因此,如果您已经有了一些复杂的条件,然后尝试调用
orWhere(new condition 1)
->andWhere(new condition 2)你会得到
(复条件)或(新条件1)和(新条件2)。
但在你的情况下,你需要得到这样的东西:
(复条件1)或(复条件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();https://stackoverflow.com/questions/72901505
复制相似问题