#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. Я уже использую его в запросе, который я предоставил выше.