如何在YII2 ActiveRecord查询中说(a AND b)OR(c AND d)?

时间:2015-08-06 15:19:03

标签: php activerecord orm yii2

我很难使用YII2的ORM,它没有记录一些非常简单的典型SQL案例,如

伪代码

SELECT * FROM table WHERE (a=1 AND b=2) OR (a=3 AND b=4)

我尝试了什么:

// should represent the commented logic, but does not
Demo::find()
    ->where(...) // ( condition one
    ->andWhere(...) // AND condition two )
    ->orWhere(...) // OR (!) ( condition three
    ->andWhere(...) // AND condition four )

问题:

在YII2中,where() - 方法不允许“嵌套”查询,这就是我被困住的地方。 YII2只允许说简单的AND .. OR costructs,而不是一组AND。

3 个答案:

答案 0 :(得分:3)

where()方法允许嵌套条件:

Demo::find()->where(['or', ['a' => 1, 'b' => 2], ['a' => 3, 'b' => 4]]);

官方文档here中有一些例子。

更复杂的例子(正如你在评论中所说):

Demo::find()->where([
    'or',
    ['and', ['not in', 'a' => [1, 2]], ['not in', 'b' => [3, 4]]],
    ['a' => [5, 6]], 'b' => [7, 8]],
]);

另一个例子可以在类似的问题here中找到。

答案 1 :(得分:2)

你可以这样做

Demo::find()
    ->where('(a = :a AND b = :b)', [
        ':a' => 'bla',
        ':b' => 'bla',
    ])
    ->orWhere('(c = :c AND d = :d)', [
        ':c' => 'bla',
        ':d' => 'bla',
    ]);

文档http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detail可以很好地解释where选项的可能性。包括如何使用子查询。

以及说明解释了如何以与上面显示的不同的方式创建集。

答案 2 :(得分:0)

Demo::find()->where('a=1 and b=2 or f=3')->one();