Laravel Eloquent Query для проверки перекрывающихся полей начала и конца DateTime - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать систему бронирования, где пользователь выбирает дату и время начала.Система создает дату и время окончания на основе наибольшего времени обслуживания продукта.На данный момент это все выяснили.

В моей базе данных есть таблица для моих событий, которая имеет:

vendor_id | user_id | start | end

Начальный и конечный столбцы имеют тип DateTime.

В моем контроллере япытаясь выяснить, доступны ли конкретная дата и время, но по какой-то причине я не могу заставить ее показывать элементы, где время перекрывается.

Вот мой код контроллера:

$items = $query->where('vendor_id', $user->vendor->id)->where('start', '<=', date('Y-m-d H:i:s', strtotime($start)))->whereDate('end', '>=', date('Y-m-d H:i:s', strtotime($end)))->get();

Итак, несколько примеров сценариев ...

У меня есть событие в системе с началом 2019-01-01 13: 00: 00 и время окончания 2019-01-01 17: 00: 00 .

Если я выберу время начала 2019-01-01 12:00: 00 и время окончания 2019-01-01 16:00:00, затем он проходит мой чек выше, но эти времена явно перекрываются на несколько часов.

Я пытаюсь найти решение для извлечения предметовдаже если они перекрываются, НЕ ПРОСТО, если их время начала и окончания соответствуют определенной проверке.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 10 декабря 2018

Не до конца понимаю ваш вопрос, но все равно постараюсь ответить на него.Для наложений дат я вижу четыре сценария, где может произойти наложение.Рассмотрим A как промежуток времени вашего события и B как промежуток времени параметра поиска

1)
   A1          A2
B1       B2


2)
   A1          A2
         B1       B2


3)
   A1          A2
B1                B2


4)
   A1          A2
       B1  B2

В переводе для сравнения это будет

  • 1) B1 A1
  • 2) B1> A1 и B1
  • 3) B1 A1
  • 4) B1> A1 и B1

1,3 - это то же самое, что и 2,4

И в laravel этого должно быть достаточно

$query->where(function ($query) {
    $query->where([
        [$B1, '<', $A1],
        [$B2, '>', $A1],
    ])->orWhere([
        [$B1, '>', $A1],
        [$B1, '<', $A2],
    ]);
});

В качестве выражения sql это будет

where (($B1 < $A1 and $B2 > $A1) or ($B1 > $A1 and $B1 < $A2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...