Всем привет!
Есть три таблицы:
appointment,
profile,
event (назначения, профиль, мероприятия)
Данные:
Мероприятие 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();
SQLSELECT `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 с более широким диапазоном дат.
Как мне сделать запрос на свободные даты пользователя, чтобы он учитывал все мероприятия и проверял все диапазоны дат, даже те, которые выходят за рамки текущего мероприятия?
Благодарю!