Yii2: как использовать приоритет с andWhere и orWhere? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть запрос 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 голосов
/ 10 октября 2018

Вы можете использовать код ниже для вашего запроса:

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').
0 голосов
/ 05 октября 2018

Самый простой способ - использовать один массив с правильной вложенностью:

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>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...