Поиск по необязательным полям

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 09:28

Здравствуйте.
У меня есть поля в бд: one,two,three,four,five,six
Обязательные для заполнения: two,three,four
Вопрос, как мне проверять, заполнено ли поле one, five и six? и искать потом если заполнено one с $model->one и т.д.

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

 $v = Feedauto::find()
                    ->andFilterWhere(['two', $model->two])
                    ->andFilterWhere(['three', $model->three])
                    ->andFilterWhere(['four', $model->four])
                    ->all();
Надеюсь меня поняли))
т.е. проверка, если поле пустое, не искать по нему, если заполнено, то искать по нему...

someweb
Сообщения: 533
Зарегистрирован: 2017.03.09, 10:12

Re: Поиск по необязательным полям

Сообщение someweb » 2018.09.10, 09:39

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

 
$v = Feedauto::find()
                    ->andFilterWhere(['two', $model->two])
                    ->andFilterWhere(['three', $model->three])
                    ->andFilterWhere(['four', $model->four])
                    ->andFilterWhere(['one', $model->one])
                    ->andFilterWhere(['five', $model->five])
                    ->andFilterWhere(['six', $model->six])
                    ->all();
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 09:48

someweb писал(а):
2018.09.10, 09:39

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

 
$v = Feedauto::find()
                    ->andFilterWhere(['two', $model->two])
                    ->andFilterWhere(['three', $model->three])
                    ->andFilterWhere(['four', $model->four])
                    ->andFilterWhere(['one', $model->one])
                    ->andFilterWhere(['five', $model->five])
                    ->andFilterWhere(['six', $model->six])
                    ->all();
так тут нет проверки же... у меня поле one, five, six может быть заполнено, а может быть и нет.... а в $model->one, $model->five, $model->six заполнены 100%. так не будет работать же...

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 10:24

->andFilterWhere(['or',['region'=>null],['region' => $model->region_id]]) может так как-то?


someweb
Сообщения: 533
Зарегистрирован: 2017.03.09, 10:12

Re: Поиск по необязательным полям

Сообщение someweb » 2018.09.10, 11:27

/**
* Adds an additional WHERE condition to the existing one ignoring empty parameters.
* The new condition and the existing one will be joined using the 'AND' operator.
* @param array $condition the new WHERE condition. Please refer to [[where()]]
* on how to specify this parameter.
* @return $this the query object itself
* @see filterWhere()
* @see orFilterWhere()
*/
public function andFilterWhere(array $condition);
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 13:20

someweb писал(а):
2018.09.10, 11:27
/**
* Adds an additional WHERE condition to the existing one ignoring empty parameters.
* The new condition and the existing one will be joined using the 'AND' operator.
* @param array $condition the new WHERE condition. Please refer to [[where()]]
* on how to specify this parameter.
* @return $this the query object itself
* @see filterWhere()
* @see orFilterWhere()
*/
public function andFilterWhere(array $condition);
Да, но

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

 $v = Feedauto::find()
                    ->andFilterWhere(['two' => $model->two])
                    ->andFilterWhere(['three' => $model->three])
                    ->andFilterWhere(['four' => $model->four])
                    ->andFilterWhere(['one' => $model->one])
                    ->andFilterWhere(['five' => $model->five])
                    ->andFilterWhere(['six' => $model->six])
                    ->andFilterWhere(['region' => $model->region_id])
                    ->all();

                var_dump($v);
Получаю: array(0) { }

someweb
Сообщения: 533
Зарегистрирован: 2017.03.09, 10:12

Re: Поиск по необязательным полям

Сообщение someweb » 2018.09.10, 13:29

Смотрите какой SQL формируется.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 13:32

someweb писал(а):
2018.09.10, 13:29
Смотрите какой SQL формируется.
как это сделать?
Последний раз редактировалось Artikk 2018.09.10, 13:38, всего редактировалось 1 раз.

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 13:34

вот вроде:

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

SELECT * FROM `feedauto` WHERE (`two`='2') AND (`three`='2') AND (`four`='2') AND (`one`='a') AND (`five`='a') AND (`six`='a') AND (`region`='22')

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 13:59

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

 $v = Feedauto::find()
                    ->andFilterWhere(['two' => $model->two])
                    ->andFilterWhere(['three' => $model->three])
                    ->andFilterWhere(['four' => $model->four])
                    ->andFilterWhere(['or', 'region IS NULL', ['region' => $model->region_id]])
                    ->andFilterWhere(['or', 'one IS NULL', ['one' => $model->one]])
                    ->andFilterWhere(['or', 'five IS NULL', ['five' => $model->five]])
                    ->andFilterWhere(['or', 'six IS NULL', ['six' => $model->six]])
                    ->all();
Так показывает запрос

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

SELECT * FROM `feedauto` WHERE (`two`='2') AND (`three`='2') AND (`four`='2') AND ((region IS NULL) OR (`region`='22')) AND ((one IS NULL) OR (`one`='a')) AND ((five IS NULL) OR (`five`='a')) AND ((six IS NULL) OR (`six`='a'))
но все равно var_dump= array(0) { }

someweb
Сообщения: 533
Зарегистрирован: 2017.03.09, 10:12

Re: Поиск по необязательным полям

Сообщение someweb » 2018.09.10, 14:09

Зачем null? andFilterWhere не добавляет условие, если параметр пустой, ищите ошибку в своей логике.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 14:13

в какой логике? я вам пишу то, что возвращается...

someweb
Сообщения: 533
Зарегистрирован: 2017.03.09, 10:12

Re: Поиск по необязательным полям

Сообщение someweb » 2018.09.10, 14:18

Так, ладно. Во первый ваш запрос

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

SELECT * FROM `feedauto` WHERE (`two`='2') AND (`three`='2') AND (`four`='2') AND (`one`='a') AND (`five`='a') AND (`six`='a') AND (`region`='22')
Все поля модели заполнены, у вас сформировался запрос по всем полям. Что вам в нем не нравится?
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 14:21

поле one не заполнено.... как мне сделать, что если он не пустое, то искать и по нему, еcли пустое, не искать. тоже самое поля
five, six, region

someweb
Сообщения: 533
Зарегистрирован: 2017.03.09, 10:12

Re: Поиск по необязательным полям

Сообщение someweb » 2018.09.10, 14:24

Ну как не заполнено, если в запросе AND (`one`='a') ?!! Оно не пустое, сделайте var_dump($model).
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 14:25

$model - это другая модель. и там ВСЕ заполнено. мне нужно сравнить с моей моделью (второй). и если там не заполнено поле, не сравнивать

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 14:27

Вот весь код, чтобы вы понимали:

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

$model = new Auto();
            $model->date = date('d-m-Y');
            $model->user_id = Yii::$app->user->id;

            if ($model->load(Yii::$app->request->post()) && $model->save()) {

                //подписка
                $v = Feedauto::find()
                    ->andFilterWhere(['two' => $model->two])
                    ->andFilterWhere(['three' => $model->three])
                    ->andFilterWhere(['four' => $model->four])
                    ->andFilterWhere(['or', 'region IS NULL', ['region' => $model->region_id]])
                    ->andFilterWhere(['or', 'one IS NULL', ['one' => $model->one]])
                    ->andFilterWhere(['or', 'five IS NULL', ['five' => $model->five]])
                    ->andFilterWhere(['or', 'six IS NULL', ['six' => $model->six]])
                    ->all();

                //var_dump($v);
                
                //дальнейшие действия с выборкой
               
                Yii::$app->session->setFlash('Mobile');
                return $this->refresh();
            }

т.е. мы заполнили $model и записали в бд, потом сразу ищем по этим данным из другой таблице Feedauto, при этом поля из таблицы Feedauto (one, four, six) могут быть не заполнены...

Artikk
Сообщения: 740
Зарегистрирован: 2017.02.10, 09:12

Re: Поиск по необязательным полям

Сообщение Artikk » 2018.09.10, 14:51

Сделал, работает:

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

$v = Feedauto::find()
                    ->andFilterWhere(['two' => $model->two])
                    ->andFilterWhere(['three' => $model->three])
                    ->andFilterWhere(['four' => $model->four])
                    ->andFilterWhere(['or', 'region = ""', ['region' => $model->region_id]])
                    ->andFilterWhere(['or', 'one = ""', ['one' => $model->one]])
                    ->andFilterWhere(['or', 'five = ""', ['five' => $model->five]])
                    ->andFilterWhere(['or', 'six = ""', ['six' => $model->six]])
                    ->all();

Ответить