搜索

首页  >  问答  >  正文

使用Yii Query Builder编写此SQL查询的方法

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

1

2

3

4

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 查询生成器,如下所示:

1

2

3

4

5

6

7

8

9

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,它以这种奇怪的方式返回:

1

2

3

4

5

6

7

8

9

10

11

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')

抱歉,如果这样读起来很困难。

任何人都可以帮助我按照我想要的方式制作查询生成器吗?我将不胜感激

P粉990568283P粉990568283283 天前523

全部回复(1)我来回复

  • P粉596191963

    P粉5961919632024-04-02 19:22:21

    每当您使用 andWhere()orWhere() 时,查询生成器都会采用现有条件并执行如下操作:

    分别。

    因此,如果您已经遇到一些复杂的情况,然后尝试致电

    1

    2

    orWhere(new condition 1)

    ->andWhere(new condition 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();
    

    回复
    0
  • 取消回复