Выбор значения сразу из двух диапозонов.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
guru_nemo
Сообщения: 68
Зарегистрирован: 2017.04.10, 21:28

Выбор значения сразу из двух диапозонов.

Сообщение guru_nemo »

Подскажите, как выбрать значения сразу для двух диапазонов дат. Т.е. (var>2 & var<5)&(var>8 & var<12)

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

$users_with_report = \common\models\User::find()
                ->select(['user.id', 'profile.user_id', 'profile.name'])
                ->where('user.id <> 1')
                ->joinWith([
                    'reports' => function ($query) use ($cond1, $cond2) {
                        $query->select(['report.id', 'report.date', 'report.profile_id'])
                            ->onCondition(['and', $cond1, $cond2]);
                    }
                ])
                ->all();
где $cond1 = var>2;
$cond2 = var<5;
$cond3 = var>8;
$cond4 = var<12;
вот сюда дописать выборку из второго диапозона, т.е. дописать $cond3, $cond4

guru_nemo
Сообщения: 68
Зарегистрирован: 2017.04.10, 21:28

Re: Выбор значения сразу из двух диапозонов.

Сообщение guru_nemo »

если через Union это сделать, то как его записать в таком варианте?

skynin
Сообщения: 263
Зарегистрирован: 2017.12.12, 10:09

Re: Выбор значения сразу из двух диапозонов.

Сообщение skynin »

union вряд ли тут нужен

делайте joinWith по ключевым полям, а не условным

а условия через ИЛИ делаете обычным viewtopic.php?t=34082

может быть с указанием таблицы

БД разберется, а Yii2 получит id для дозагрузки with

вот это
'reports' => function ($query) use ($cond1, $cond2)
можно, не особо нужно

БД прекрасно понимают что связь по ключевым полям НЕ означает что надо выбирать обе связанные таблицы полностью, и ограничивают выборку по условиям в where

ну и общее правило, когда такие сложности:
напишите требуемый запрос вручную, а потом уже оформите его в конструкцию QueryBuilder

guru_nemo
Сообщения: 68
Зарегистрирован: 2017.04.10, 21:28

Re: Выбор значения сразу из двух диапозонов.

Сообщение guru_nemo »

заменил ->onCondition(['and', $cond3, $cond4]) на ->andWhere(['and', $cond5, $cond6])->orWhere(['and', $cond3, $cond4]) вроде заработало.

skynin
Сообщения: 263
Зарегистрирован: 2017.12.12, 10:09

Re: Выбор значения сразу из двух диапозонов.

Сообщение skynin »

guru_nemo писал(а):
2020.05.15, 12:55
заменил ->onCondition(['and', $cond3, $cond4]) на ->andWhere(['and', $cond5, $cond6])->orWhere(['and', $cond3, $cond4]) вроде заработало.
посмотрите получившийся sql запрос.
он? такой какой нужно?

guru_nemo
Сообщения: 68
Зарегистрирован: 2017.04.10, 21:28

Re: Выбор значения сразу из двух диапозонов.

Сообщение guru_nemo »

skynin писал(а):
2020.05.15, 13:06
guru_nemo писал(а):
2020.05.15, 12:55
заменил ->onCondition(['and', $cond3, $cond4]) на ->andWhere(['and', $cond5, $cond6])->orWhere(['and', $cond3, $cond4]) вроде заработало.
посмотрите получившийся sql запрос.
он? такой какой нужно?
выборка получилась правильная.

skynin
Сообщения: 263
Зарегистрирован: 2017.12.12, 10:09

Re: Выбор значения сразу из двух диапозонов.

Сообщение skynin »

guru_nemo писал(а):
2020.05.21, 11:16
выборка получилась правильная.
а запрос проверили?
результат работы QueryBuilder'а - sql запрос, а не данные.
Выборка в частном случае, на тестовых данных может быть получена правильная и некорректным sql запросом.
И станет неправильной на реальных данных. Через месяц, на боевом сервере. и конечно без ошибок, а просто в другом месте какие-то странные данные стали сохранятся.

Я к тому что в любых случаях когда формирование запроса вызывало трудности, было несколько попыток заставить Yii генерить такой запрос какой нужно ("ай шайтан, как-то заработало"), итоговой проверкой будет соответствие sql запроса требуемой бизнес-логики

Если конечно требуется надежная, качественная разработка.
Бывает что не требуется, и можно делать как на выброс

Ответить