#laravel #mongodb #eloquent #calendar #jenssegers-mongodb
#laravel #mongodb #красноречивый #Календарь #jenssegers-mongodb
Вопрос:
Я собираюсь дать краткий обзор конфигурации приложения, прежде чем перейти к запросу. Я запускаю приложение Laravel 6 с использованием MongoDB через плагин Jenssegers MongoDB. До сих пор мне не приходилось писать необработанный запрос mongo, и я надеюсь, что мне не придется и для этого, я имею в виду, я понятия не имею, как добиться того, чего я хочу, с помощью Eloquent даже с SQL, поэтому не уверен, возможно ли это.
У меня есть три модели:
Пользователь — стандартные сведения о пользователе
Доступность — модель типа события с start_date, end_date, duration, user_id и другими несвязанными свойствами
Модель типа сдвига — события с start_date, end_date, duration и другими несвязанными свойствами
У пользователя может быть много доступных
Что мне нужно сделать сейчас, так это для данной смены найти пользователей, которые доступны для работы в это время (от start_date смены до end_date). Теперь это довольно просто, я делаю:
User::whereHas('availability', function($query) use ($shift_start, $shift_end) {
$query->where('start_date', '<=', $shift_start)->where('end_date', '>=', $shift_end);
})->get();
Все это работает нормально, но пользователи тоже хотят иметь возможность создавать доступность:
Доступность 1: 21 сентября 2020 г. 14:00 — 21 сентября 2020 г. 23:59
Доступность 2: 22 сентября 2020 г. 00:00 — 22 сентября 2020 г. 06:00
Это означает, что эти два события как бы «связаны» вместе, хотя они являются двумя событиями. Технически этот пользователь будет доступен с 21 сентября 2020 года 14:00 — 22 сентября 2020 года 06:00, поэтому, если даты начала смены: 21 сентября 2020 года 18:00, окончание: 22 сентября 2020 года 04:00, пользователь должен быть возвращен как доступный для смены. Мне не удалось найти способ включить этот крайний случай в запрос, и это то, с чем мне нужна помощь.
Комментарии:
1. Все еще пытаюсь разобраться в этом, любой ввод приветствуется!!!
Ответ №1:
Можете ли вы попытаться выполнить свой запрос, как показано ниже,
User::whereHas('availability', function($query) use ($shift_start, $shift_end) {
$query->where('start_date', '>=', $shift_start)->where('end_date', '<=', $shift_end);
$query->orwhereBetween('start_date',array($shift_start,$shift_end))
$query->orWhereBetween('end_date',array($shift_start,$shift_start))
})->get();
Комментарии:
1. Я не думал об этом. Я попробую и оставлю отзыв, спасибо. Также, я так понимаю, вы имели в виду в последней строке между end_date $ shift_start, $ shift_end?
2. Да, сравнить
orwhereBetween
сstart_date
иend_date
3. Прежде всего, я заметил, что у меня был недостаток в логике,
$query->where('start_date', '<=', $shift_start)->where('end_date', '>=', $shift_end);
необходимый для изменения операторов здесь, поскольку сдвиг должен быть в ПРЕДЕЛАХ доступности. Я попробовал ваше решение, и если я также оставлю приведенную выше строку кода, тогда я получу только строгие соответствия, как у меня было ниже. Если я удалю свою строку кода и использую только orWhereBetweens, я получаю желаемые периоды, но я также получаю события с промежутком между ними.4. Он вернул true для пользователя, у которого была доступность 1: 21 сентября 2020 г. 14:00 — 21 сентября 2020 г. 23:59 Доступность 2: 22 сентября 2020 г. 00:00 — 22 сентября 2020 г. 06:00, но также true для пользователя, у которого была доступность 1: 21 сентября 2020 г. 14:00 — 21 сентября2020 22:00 Доступность 2: 22 сентября 2020 01:00 — 22 сентября 2020 06:00