Объединить orWhere и andWhere

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Объединить orWhere и andWhere

Сообщение cruim »

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

$query = Order::find()->where([['order_totalSumm' => '330']])
->joinWith(['address' => function($query){
            $query->andWhere(['NOT', ['= BINARY','order_delivery_address_city' , 'Москва',]]);
            $query->andWhere(['NOT', ['= BINARY','order_delivery_address_city' , 'Челябинск']]);
Как можно привести эту конструкцию к виду, типа `'неМосква' or 330`
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Объединить orWhere и andWhere

Сообщение rak »

а как этот запрос должен в sql выглядеть?
потому что в коде одно, в вопросе другое.
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: Объединить orWhere и andWhere

Сообщение cruim »

rak писал(а): 2017.01.15, 23:30 а как этот запрос должен в sql выглядеть?
потому что в коде одно, в вопросе другое.
Как-то так

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

SELECT `order`.order_totalSumm FROM `order` WHERE `order_totalSumm` = 330
INNER JOIN `order_delivery_address` ON `order`.order_id = order_delivery_address.order_id
WHERE order_delivery_address.order_delivery_city != 'Москва'
OR order_delivery_address.order_delivery_city != 'Челябинск'
Могу ошибаться(базы под рукой нет). Но общий смысл такой, вывести записи, где город !Москва или сумма=330
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Объединить orWhere и andWhere

Сообщение Alexum »

Зачем вы используете анонимную функцию и перемешиваете запрос, когда можно обойтись без неё и выстраивать в более логичной последовательности? В одной из ваших же предыдущих тем я приводил пример.

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

$query = Order::find()->joinWith('address')
->andWhere(['любой_атрибут_из_order_или_address'=>value, ..., ...])
->orWhere(['любой_атрибут_из_order_или_address'=>value, ..., ...]);
Aleksey_ZX
Сообщения: 52
Зарегистрирован: 2015.08.07, 18:12

Re: Объединить orWhere и andWhere

Сообщение Aleksey_ZX »

как то так
andWhere([
'or',
['!=','order_delivery_address_city', 'Москва'].
'order_delivery_address_city != "Москва"'

]);
а воообще тут все написано https://github.com/yiisoft/yii2/blob/ma ... ператоров-
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Объединить orWhere и andWhere

Сообщение Alexum »

Aleksey_ZX писал(а): 2017.01.16, 09:20 как то так
andWhere([
'or',
['!=','order_delivery_address_city', 'Москва'].
'order_delivery_address_city != "Москва"'

]);
Полегче, пожалуйста, вы сейчас тут насоветуете...
Aleksey_ZX
Сообщения: 52
Зарегистрирован: 2015.08.07, 18:12

Re: Объединить orWhere и andWhere

Сообщение Aleksey_ZX »

и что же я насоветовал ??,
в одном месте опечатка вместо , поставил .
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Объединить orWhere и andWhere

Сообщение Alexum »

Aleksey_ZX писал(а): 2017.01.16, 10:04 и что же я насоветовал ??,
в одном месте опечатка вместо , поставил .
Одно и тоже, только по-разному собранное, вывели через or. У ТСа проблема в другом - ему нужно задать в запросе значения полей из разных таблиц. Если бы он изначально не изощрялся с запросом, то и проблемы такой не возникло.
Aleksey_ZX
Сообщения: 52
Зарегистрирован: 2015.08.07, 18:12

Re: Объединить orWhere и andWhere

Сообщение Aleksey_ZX »

Alexum писал(а): 2017.01.16, 12:27 Одно и тоже, только по-разному собранное, вывели через or. У ТСа проблема в другом - ему нужно задать в запросе значения полей из разных таблиц. Если бы он изначально не изощрялся с запросом, то и проблемы такой не возникло.
Для того что бы он мог выбрать, как удобнее. Если разные таблицы и поля совпадают то нужно прописывать таблицы.
А вообще в документации все написано. Я думаю, прочитав документацию, такие вопросы отпадут.
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: Объединить orWhere и andWhere

Сообщение cruim »

Alexum писал(а): 2017.01.16, 09:00 Зачем вы используете анонимную функцию и перемешиваете запрос, когда можно обойтись без неё и выстраивать в более логичной последовательности? В одной из ваших же предыдущих тем я приводил пример.

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

$query = Order::find()->joinWith('address')
->andWhere(['любой_атрибут_из_order_или_address'=>value, ..., ...])
->orWhere(['любой_атрибут_из_order_или_address'=>value, ..., ...]);
Делаю так

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

 $query = Order::find()

        ->joinWith(['address' => function($query){
            $query->andWhere(['NOT', ['order_delivery_address_city' => 'Москва']]);
            $query->andWhere(['NOT', ['order_delivery_address_city' => 'Челябинск']]);
            }])
            ->joinWith(['orderDeliveryData' => function($query)
            {
                $query->andWhere(['order_delivery_data_courierId' => '51']);
            }])
        ->orWhere(['and',['order_totalSumm' => 330], ['order_delivery_data_courierId' => '51']]);
Ничего не выводится. Где ошибка?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Объединить orWhere и andWhere

Сообщение rak »

зачем всё это? зачем условия прописывать в анонимной функции, если всё равно блок where будет один?
что вот это такое?

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

order_delivery_address.order_delivery_city != 'Москва'
OR order_delivery_address.order_delivery_city != 'Челябинск'
почему там OR?

такой нужен запрос?

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

SELECT `order`.order_totalSumm FROM `order` 
INNER JOIN `order_delivery_address` ON `order`.order_id = order_delivery_address.order_id
WHERE `order_totalSumm` = 330 AND order_delivery_address.order_delivery_city NOT IN('Москва', 'Челябинск')
ps. перед тем, как начинать строить запрос в yii2 было бы неплохо его таки написать в sql, проверить, и только после этого мучать фреймверк :)
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: Объединить orWhere и andWhere

Сообщение cruim »

rak писал(а): 2017.01.17, 19:58 зачем всё это? зачем условия прописывать в анонимной функции, если всё равно блок where будет один?
что вот это такое?

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

order_delivery_address.order_delivery_city != 'Москва'
OR order_delivery_address.order_delivery_city != 'Челябинск'
почему там OR?

такой нужен запрос?

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

SELECT `order`.order_totalSumm FROM `order` 
INNER JOIN `order_delivery_address` ON `order`.order_id = order_delivery_address.order_id
WHERE `order_totalSumm` = 330 AND order_delivery_address.order_delivery_city NOT IN('Москва', 'Челябинск')
ps. перед тем, как начинать строить запрос в yii2 было бы неплохо его таки написать в sql, проверить, и только после этого мучать фреймверк :)
С or напутал. Насколько я понял, ваш запрос выведет список, где сумма = 330 и город !=Москва и Челябинск. А надо вывести, где город =!Москва и Челябинск And 'order_delivery_data_courierId' => '51'. А также все заказы, где 'order_delivery_data_courierId' => '51' and 'order_totalSumm' => 330. Вторая часть запроса должна игнорировать условия первой части, например, если в Москве, есть заказ стоимостью 330 и курьером=51, то он должен попасть в выборку.
Aleksey_ZX
Сообщения: 52
Зарегистрирован: 2015.08.07, 18:12

Re: Объединить orWhere и andWhere

Сообщение Aleksey_ZX »

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

 $query->orWhere([
            ['and',
                ['not in','{{%название талицы без префикса}}.order_delivery_address_city',['Москва','']],
                ['{{%название талицы}}.order_delivery_data_courierId'=>51],
            ],
            ['and',
                ['{{%название талицы}}.order_totalSumm'=>330],
                ['{{%название талицы}}.order_delivery_data_courierId'=>51],
            ]
        ]);
В документации все написано как строить многоуровневые запросы
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Объединить orWhere и andWhere

Сообщение rak »

cruim писал(а): 2017.01.17, 20:18
С or напутал. Насколько я понял, ваш запрос выведет список, где сумма = 330 и город !=Москва и Челябинск. А надо вывести, где город =!Москва и Челябинск And 'order_delivery_data_courierId' => '51'. А также все заказы, где 'order_delivery_data_courierId' => '51' and 'order_totalSumm' => 330. Вторая часть запроса должна игнорировать условия первой части, например, если в Москве, есть заказ стоимостью 330 и курьером=51, то он должен попасть в выборку.
так?

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

SELECT `order`.order_totalSumm FROM `order` 
INNER JOIN `order_delivery_address` ON `order`.order_id = order_delivery_address.order_id
WHERE order_delivery_data_courierId=51 AND (order_delivery_address.order_delivery_city NOT IN('Москва', 'Челябинск') OR `order_totalSumm` = 330)
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Объединить orWhere и andWhere

Сообщение Alexum »

rak, похоже на правду. Думаю собрать можно как-то так:

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

$query = Order::find()->joinWith('address')
->where(['order_delivery_data_courierId' => 51])
->andWhere(['OR',['NOT IN','order_delivery_city ', ['Москва','Челябинск']],['order_totalSumm'=>330]]);
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: Объединить orWhere и andWhere

Сообщение cruim »

Alexum писал(а): 2017.01.17, 21:51 rak, похоже на правду. Думаю собрать можно как-то так:

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

$query = Order::find()->joinWith('address')
->where(['order_delivery_data_courierId' => 51])
->andWhere(['OR',['NOT IN','order_delivery_city ', ['Москва','Челябинск']],['order_totalSumm'=>330]]);
Подправил немного запрос

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

$query = Order::find()->joinWith('orderDeliveryData')
            ->where(['order_delivery_data_courierId' => 51])
            ->joinWith('address')
            ->andWhere(['OR',['NOT IN','order_delivery_address_city ', ['Москва','Челябинск']],['order_totalSumm'=>330]]);
Выдает ошибку Unknown column 'order_delivery_address_city ' in 'where clause' Хотя она там точно есть и модели связаны
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Объединить orWhere и andWhere

Сообщение Alexum »

Шальной пробел попал в конец 'order_delivery_address_city '. У Вас БД такое прощает? MSSQL прощает :)
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: Объединить orWhere и andWhere

Сообщение cruim »

Alexum писал(а): 2017.01.17, 22:21 Шальной пробел попал в конец 'order_delivery_address_city '. У Вас БД такое прощает? MSSQL прощает :)
:oops: Спасибо всем за помощь.
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Объединить orWhere и andWhere

Сообщение rak »

и зачем опять же joinWith 2 раза цеплять? зачем усложнять на ровном месте? :)

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

$query = Order::find()->joinWith(['address', 'orderDeliveryData'])
	    ->where(['order_delivery_data_courierId' => 51])
            ->andWhere(['OR',['NOT IN','order_delivery_address_city', ['Москва','Челябинск']],['order_totalSumm'=>330]]);
Ответить