Сложные условия для Where

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
ind
Сообщения: 3
Зарегистрирован: 2017.05.23, 19:31

Сложные условия для Where

Сообщение ind »

Всем привет, господа.

У меня возникла проблема с составлением WHERE для поиска. Подскажите, пожалуйста.

Мне нужно составить с помощью средств Yii2 вот такой SQL:

Код: Выделить всё

SELECT `table1`.* FROM `table1`
LEFT JOIN `table2` ON table1.table2_id = table2.id
LEFT JOIN `table3` ON table2.param1 = table3.id
LEFT JOIN `table4` ON table2.param2 = table4.id
LEFT JOIN `table5` ON table5.id = table1.param3
WHERE
(`table3`.`active` = '1' OR `table2`.`param1` IS NULL) AND
(`table4`.`active` = '1' OR `table1`.`param2` IS NULL) AND 
(`table5`.`active` = '1' OR `table1`.`param3` IS NULL)
Если просто начать писать в духе (опуская джоины):

Model::find()->where(['table3.active' => 1])->orWhere(['table2.param1' => null])->andWhere(... и так далее

То вложенность скобок будет совершенно не такая, как мне нужно. Как это можно исправить? findBySql не предлагать, я работаю с легаси-проектом, и этот объект потом уходит дальше по коду, т.к. заменить его SQL нельзя.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Сложные условия для Where

Сообщение samdark »

Подзапросы через новые инстансы Query попробуйте.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Сложные условия для Where

Сообщение caHek2x »

Код: Выделить всё

where([
	"AND"
	[
		"OR"
		["table3.active"=>1],
		["table2.param1"=>NULL],
	]
	[
		"OR"
		["table4.active"=>1],
		["table1.param1"=>NULL],
	]
	[
		"OR"
		["table5.active"=>1],
		["table1.param1"=>NULL],
	]
])
чтото в таком духе ...
ind
Сообщения: 3
Зарегистрирован: 2017.05.23, 19:31

Re: Сложные условия для Where

Сообщение ind »

samdark писал(а): 2017.05.23, 19:54 Подзапросы через новые инстансы Query попробуйте.
А как это выглядит примерно? Чтобы понимать куда гуглить. А-ля вот так?

Код: Выделить всё

->where( (new Query())->where() )-> 
caHek2x писал(а): 2017.05.23, 20:11 чтото в таком духе ...
Большое спасибо, попробую через пару часов!
ind
Сообщения: 3
Зарегистрирован: 2017.05.23, 19:31

Re: Сложные условия для Where

Сообщение ind »

caHek2x писал(а): 2017.05.23, 20:11 чтото в таком духе ...
Помогло!

Для потомков напишу как сделал:

Код: Выделить всё

            echo $result
                ->leftJoin(...)
                ->leftJoin(...)
                ->leftJoin(...)
                ->leftJoin(...)
                ->where(
                    [
                            "OR",
                            ["table1.param1" => 1],
                            ["table1.param2" => null],
                    ]
                )
                ->andWhere(
                    [
                        "OR",
                        ["table2.param1" => 1],
                        ["table2.param2" => null]
                    ]
                )
                ->andWhere(
                    [
                        "OR",
                        ["table3.param1" => 1],
                        ["table3.param2" => null]
                    ]
                )
                ->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql;
Результат, соответственно, такой, как и нужно:

Код: Выделить всё

...
WHERE
((`table1`.`param1` = '1') OR (`table1`.`param2` IS NULL)) AND
((`table2`.`param1` = '1') OR (`table2`.`param2` IS NULL)) AND 
((`table3`.`param1` = '1') OR (`table3`.`param2` IS NULL))
Ответить