Как получить все строки между двумя датами с помощью запросов laravel?

#mysql #laravel #laravel-query-builder

#mysql #laravel #laravel-конструктор запросов

Вопрос:

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

Запрос к базе данных должен включать каждый контракт, действительный в течение этого периода, и каждый день в этот период должен быть покрыт контрактом.

Отель с запросом contracts:

 Hotel::with(["contracts" => function($query) use($from, $to, $columns) {
    $query->select(
    "contracts.*",
    DB::raw("SUM(contract_rooms.we_price) as total_we_price"),
    DB::raw("SUM(contract_rooms.wd_price) as total_wd_price"))
        ->whereBetween("contracts.to_time" , [$from, $to])
        ->orWhereBetween("contracts.from_time" , [$from, $to])
        ->orWhere(function ($query) use ($from, $to){
            $query->where("contracts.from_time", "<", $from)
                ->where("contracts.to_time", ">", $to);
        })
        ->join("contract_rooms", "contracts.id", "=", "contract_rooms.contract_id")
        ->groupBy("contract_rooms.view_id", "contract_rooms.meal_id", "contracts.room_type_id")
        ->orderBy("contract_rooms.wd_price","ASC");
            }, "reviews"])
        ->whereHas("contracts", function ($query) use ($from, $to) {
            $query->whereBetween("contracts.to_time" , [$from, $to])
                ->orWhereBetween("contracts.from_time" , [$from, $to])
                ->where(function ($query) use ($from, $to) {
                    $query->where("contracts.from_time", "<", $from)
                        ->where("contracts.to_time", ">", $to);
                    });
                });
  

Таблица отелей:

  ------------------ ----------- ------------- 
| id | hotel_name  | city_id   | description |
 ---- ------------- ----------- ------------- 
|  1 |  Hilton     | 1         | Text        |
|  2 |  Sheraton   | 1         | Text        |
|  3 |  Aston      | 1         | Text        |
 ---- ------------- ----------- -------------  
  

Таблица RoomType:

  -------------- ----------- ------ 
| id | name    | room_size | beds |
 ---- --------- ----------- ------ 
|  1 |  text   | 0         | 2    |
|  2 |  text   | 1         | 2    |
|  3 |  text   | 0         | 2    |
 -------------- ----------- ------  
  

Таблица контрактов:

  ------------- ----------- -------------- ------------ ------------- 
| id | name   | hotel_id  | room_type_id | from_time  | to_time     |
 ---- -------- ----------- -------------- ------------ ------------- 
|  1 | text   | 1         | 1            | 2020-10-14 |  2020-10-20 |
|  2 | text   | 1         | 1            | 2020-10-21 |  2020-10-30 |
|  3 | text   | 1         | 1            | 2020-11-05 |  2020-11-20 |
 ---- -------- ----------- -------------- ------------ ------------- 
  

Например:

  • если пользователь вводит даты между 14/10/2020 и 30/10/2020, он получает первые 2 строки.
  • если пользователь вводит две даты между 14/10/2020 и 14/11/2020, он ничего не получает.

Комментарии:

1. Используйте предложение whereedate

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

3. Вы пробовали whereBetween? Я думаю, это может удовлетворить то, что вы ищете.

4. Я уже использую его в запросе, который я предоставил выше.