Laravel, MongoDB: включить события с «трогательным» временем начала / окончания в запрос

#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