@BloodVIRUS

Как в yii2 сделать очень сложный where запрос?

Здравствуйте. Когда мы в yii2 оперируем простыми данными то и на выходе все просто. Вот например как вывести только новости имеющие статус опубликован:

$news = News::find();
$news->where(['publish' => 1]);
$data = $news->all();


Можно через andWhere добавить еще и еще условий. Простых.

Но что делать когда условие сложное? В моем случае есть таблица событий, у которой есть даты начала конца. Есть сопутствующая таблица сеансов. И нужно делать фильтрацию событий по дате начала окончания события, но если вдруг в событии есть сеанс, то тогда уже выводить по дате начала и окончания сеанса...

На чистом SQL должно получиться как то так:

(event_seanses IS NULL AND events.start_date <= '2023-02-26' AND events.end_date >= '2023-02-26') OR (event_seanses IS NOT NULL AND event_seances.start <= '2023-02-26' AND event_seances.end >= '2023-02-26')

Напрашивается что-то такое, что конечно же не сработало, потому что как минимум у конструкции ['IS NULL', '{{%eventsSeances}}'] должно быть три параметра...

$res->andWhere(['OR', 
									[
										'AND', 
											['IS NULL', '{{%eventsSeances}}'],
											['<=', '{{%events}}.startAt', $startAt], 
									],
									[
										'AND',
											['IS NOT NULL', '{{%eventsSeances}}'],
											['<=', '{{%eventsSeances}}.startAt', $startAt], 
											
									]
							]);
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
$res->andWhere([
                 'OR', 
                  [
                    'AND', 
                      ['event_seanses' => null],
                      ['<=', 'events.startAt', $startAt], 
                  ],
                  [
                    'AND',
                      ['not', ['event_seanses' => null]],
                      ['<=', 'eventsSeances.startAt', $startAt], 
                  ]
              ]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
v3shin
@v3shin
Веб-шаман
Попробуйте:
eventsSeances.id IS NULL = ['eventsSeances.id' => null]
eventsSeances.id IS NOT NULL = ['<>', ['eventsSeances.id' => null]]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы