myks92
@myks92
Нашёл решение — пометь вопрос ответом!

Yii Выборка из базы по датам. Что не так?

Всем привет!
Есть три таблицы: appointment, profile, event (назначения, профиль, мероприятия)

5bbfa07f992fc599546429.pngДанные:
Мероприятие 1 проходит в даты 2018-11-24 по 2018-11-25 (продолжительность 2 дня)
Мероприятие 2 проходит в даты 2018-11-25 по 2018-11-25 (продолжительность 1 день)

Формат:
Даты в базе данных хранятся в формате Y-m-d

Мне необходимо осуществить проверку на свободные даты пользователя.

Свободная дата определяется по мероприятию (таблица event). При назначении пользователя (таблица appointment) на мероприятие - делаем выборку всех назначений текущего пользователя, кроме текущего события и выполняем поиск на свободные даты по таблице с мероприятиями (таблица event). Если мы находим назначение, диапазон дат мероприятия или дата мероприятия которая совпадает/входит в даты текущего мероприятия, то выдаем ошибку о том, что пользователь уже занят в данные даты.

Я это делаю таким запросом:

$appointmentsInDates = Appointment::find()
                ->joinWith(['event', 'profile'])
                ->andWhere([Profile::tableName() . '.user_id' => $model->certification->user_id])
                ->andWhere(['!=', Event::tableName() . '.id', $model->event_id])
                ->andWhere(['>=', Event::tableName() . '.date_from', '2018-11-25'])
                ->andWhere(['<=', Event::tableName() . '.date_to', '2018-11-25'])
                ->groupBy(Event::tableName() . '.id')
                ->exists();


SQL
SELECT `appointment`.* FROM `appointment` 
LEFT JOIN `event` ON `appointment`.`event_id` = `event`.`id`
LEFT JOIN `certification` ON `appointment`.`judge_comitet_id` = `certification`.`id` 
LEFT JOIN `profile` ON `certification`.`user_id` = `profile`.`user_id` 
WHERE (`profile`.`user_id`=139) 
AND (`event`.`id` != 55) 
AND (`event`.`date_from` >= 2018-11-25) 
AND (`event`.`date_to` <= 2018-11-25) 
GROUP BY `event`.`id` 
ORDER BY `event`.`date_to`


Данный запрос работает только при условии, если у мероприятия, на которое осуществляется назначение, диапазон дат шире, чем у мероприятий на которые пользователь так же был назначен...

Однако, при назначении на Мероприятие 2, которое проходит в один день с 2018-11-25 по 2018-11-25 и имеет диапазон дат меньше, чем у мероприятий на которые пользователь так же был назначен — не находит ни одного назначения. Хотя данное назначение существует на Мероприятие 1, которое проходит в два дня с 2018-11-24 по 2018-11-25 с более широким диапазоном дат.

Как мне сделать запрос на свободные даты пользователя, чтобы он учитывал все мероприятия и проверял все диапазоны дат, даже те, которые выходят за рамки текущего мероприятия?

Благодарю!
  • Вопрос задан
  • 1343 просмотра
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Если дата у Вас хранится в виде 2018-11-24, то как можно их сравнить?
Получается что-то вроде этого
2018-11-24 >= 2018-11-24
Насколько я понимаю никак.
Я бы добавил время в сравнение
->andWhere(['>=', Event::tableName() . '.date_from', '2018-11-24 00:00:00'])

Но и это может не сработать, так как дата в базе без времени.
Добавьте время, даже желательно в timestamp
Тогда сравнить можно будет так:
->andWhere(['>=', Event::tableName() . '.date_from', strtotime('2018-11-24' . '00:00:00')])

Тут Event::tableName() . '.date_from', timestamp, это тоже выдаёт timestamp strtotime('2018-11-24' . '00:00:00')
А вторую дату можно будет сравнить так:
->andWhere(['<=', Event::tableName() . '.date_to', strtotime('2018-11-25' . '23:59:59')])

Вот как-то так, если я конечно не ошибаюсь.
Ответ написан
Ваш ответ на вопрос

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

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