Yii2:如何在andWhere和orWhere中使用优先级?

时间:2018-10-05 14:00:13

标签: yii2 where query-builder

我有一个Yii2查询,但是我遇到orWhere Yii句子的问题。

我需要以下人员:

  • 年龄未满21

  • OR 年龄在21岁以上 AND 名字叫约翰

这是我的代码。我不知道如何在Yii2中使用括号作为优先级:

Persons::find()
    ->select([Persons::tableName().".[[first_name]]"])
    ->where(['<', 'age', 21])
    ->orWhere(['>', 'age', 21])
    ->andwhere([Persons::tableName().".[[first_name]]" => 'John'])

2 个答案:

答案 0 :(得分:4)

最简单的方法是使用一个带有适当嵌套的数组:

Persons::find()
    ->select([Persons::tableName() . ".[[first_name]]"])
    ->where([
        'or',
        ['<', 'age', 21],
        [
            'and',
            ['>', 'age', 21],
            [Persons::tableName() . ".[[first_name]]" => 'John'],
        ],
    ]);

andwhere()orWhere()始终会在现有条件后附加新条件,因此您将获得类似以下内容的信息:

(((<first condition>) AND <second condition>) OR <third condition>)

答案 1 :(得分:0)

您可以使用以下代码进行查询:

Persons::find()
    ->select(["first_name"])
    ->where(['<', 'age', 21])
    ->orWhere("age > 21 AND first_name LIKE 'John'")
    ->all();

将基于以上代码生成的查询:

SELECT `first_name` FROM `persons` WHERE (`age` < 21) OR (age > 21 AND first_name LIKE 'John').