首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用Yii查询生成器编写此SQL查询

如何用Yii查询生成器编写此SQL查询
EN

Stack Overflow用户
提问于 2022-07-07 16:42:35
回答 1查看 33关注 0票数 0

我有一个SQL查询,它正在执行我想做的事情:

代码语言:javascript
运行
复制
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查询生成器,像这样:

代码语言:javascript
运行
复制
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,它以一种奇怪的方式返回:

代码语言:javascript
运行
复制
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')

对不起,如果很难这样读的话。

有人能帮我使查询生成器像我想要的那样吗?我将非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-08 07:19:18

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

(现有条件)和(新条件)

(现有条件)或(新条件)

分别使用。

因此,如果您已经有了一些复杂的条件,然后尝试调用

代码语言:javascript
运行
复制
orWhere(new condition 1)
->andWhere(new condition 2)

你会得到

(复条件)或(新条件1)和(新条件2)。

但在你的情况下,你需要得到这样的东西:

(复条件1)或(复条件2)

要获得这样的结果,您可以以同样的方式构建第一个复杂条件,但必须在一个orWhere()调用中构建第二个条件。或者,为了使其更具可读性,您可以在单个调用中构建这两种复杂条件:

代码语言:javascript
运行
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72901505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档