Построение запроса

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Cacatuidae
Сообщения: 65
Зарегистрирован: 2017.01.08, 17:39

Построение запроса

Сообщение Cacatuidae »

Подскажите, почему билдер не объединяет условия в единый кейс?

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

...
$filterConditions = [
    ...
	[
		'and',
		['or', ['between', 'product_attributes.value', 3, 4], ['product_attributes.value' => 5]],
		['product_attributes.attribute_id' => 21182]
	],
    ...
];
...
foreach ($filterConditions as $fCondition) {
	$query->andWhere($fCondition);
}
...
На выходе получаю:

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

... WHERE ((`product_attributes`.`value` BETWEEN 3 AND 4) OR (`product_attributes`.`value`=5)) AND (`product_attributes`.`attribute_id`=21182) ... 
А надо бы:

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

... WHERE (((`product_attributes`.`value` BETWEEN 3 AND 4) OR (`product_attributes`.`value`=5)) AND (`product_attributes`.`attribute_id`=21182)) ... 
Аватара пользователя
Cacatuidae
Сообщения: 65
Зарегистрирован: 2017.01.08, 17:39

Re: Построение запроса

Сообщение Cacatuidae »

Или вот проще - нужно через queryBuilder https://www.yiiframework.com/doc/guide/ ... ry-builder сформировать такое условие:
...where ((a=1 OR b=2) AND c=3) AND d=5

Что-то не могу понять какой массив надо замутить и скормить билдеру
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Построение запроса

Сообщение andku83 »

На вашем примере это не имеет значения:

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

(( 1 + 2 ) + 3 ) + ... == ( 1 + 2 ) + 3 + ...
возможно у вас получится таким способом:

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

...
$filterConditions = [
    ...
	[
		'and',
		['or', ['between', 'product_attributes.value', 3, 4], ['product_attributes.value' => 5]],
		['product_attributes.attribute_id' => 21182]
	],
    ...
];
...
$query->andWhere(['AND', $filterConditions])
...
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Построение запроса

Сообщение andku83 »

если вы не знаете логики:

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

((a=1 OR b=2) AND c=3) AND d=5 == (a=1 OR b=2) AND c=3 AND d=5
Аватара пользователя
Cacatuidae
Сообщения: 65
Зарегистрирован: 2017.01.08, 17:39

Re: Построение запроса

Сообщение Cacatuidae »

andku83 писал(а): 2018.04.03, 22:44 На вашем примере это не имеет значения:
Пример не полный, условий в $filterConditions много.
Это $query->andWhere(['AND', $filterConditions]) я пробовал - билдер падает с yii\base\ErrorException, т.к. массив составлен для него неверно.
Аватара пользователя
Cacatuidae
Сообщения: 65
Зарегистрирован: 2017.01.08, 17:39

Re: Построение запроса

Сообщение Cacatuidae »

andku83
Добром!
Дошло в чём мой косяк. Там у меня OR должно было быть, не andWhere, поэтому не объединял.
Ответить