Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет. Я долго ломал голову, как проверить, снят ли номер на определенный диапозон.
Хочу просто узнать, может есть более компактное решение.
public static function getBookingsForDateDiaposonForAllRooms(\Illuminate\Http\Request $request){
$bookings = DB::table('bookings')
//Или мы попадаем прямо в диапозон брони
->whereDate('startDate', '<', date('Y-m-d H:i:s', strtotime($request->startDate)))
->whereDate('finishDate', '>', date('Y-m-d H:i:s', strtotime($request->finishDate)))
->orWhere(function ($query) {//Или только дата заезда попадает в диапозон брони
global $request;
$query
->whereBetween('startDate',
[
date('Y-m-d H:i:s', strtotime($request->startDate)),
date('Y-m-d H:i:s', strtotime($request->finishDate))
])
;
})
->orWhere(function ($query) {//Или только дата выезда попадает в диапозон брони
global $request;
$query
->whereBetween('finishDate',
[
date('Y-m-d H:i:s', strtotime($request->startDate)),
date('Y-m-d H:i:s', strtotime($request->finishDate))
])
;
})
->get();
return $bookings;
}
Не в сети
А зачем тебе проверять именно диапазон? Было бы логичней проверять занят ли номер на конкретную дату, а там уже смотреть, на какой срок он занят.
Не в сети
Нормальный вопрос. При попытке бронирования надо проверить номера на выбранном периоде.
Если период включает в себя границы, то можно так сформулировать:
Два периода A-B и X-Y пересекаются если
X <= B and Y >= A
Условие через И удобнее оптимизировать индексами.
И возвращаясь к вопросу ТС
может есть более компактное решение
Да, условие через И в eloquent пишется в один вызов:
->where([['d_from', '<=', $d2], ['d_to', '>=', $d1]])
Изменено artoodetoo (17.03.2019 09:12:24)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Тут нюанс именно в способе представления даты "По". Когда человеку надо одну ночь переночевать, он указывает, что номер нужен с пятницы по субботу, например. Это одна ночь, а форме ввода оно выглядит как две разные даты. При этом хранить в базе такие периоды удобно как две одинаковые даты.
Надеюсь понятно сформулировал
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
удобно как две одинаковые даты.
Про это я не подумал. Вроде бы да, но тут все зависит от формулировки и про это я не подумал. В форме я указываю это, как "дата вьезда" и "дата выезда" и тут все логично. Но номер будет забронирован по факту с даты вьезда по дату выезда минус один день.
Но я храню в datetime ведь и когда следующий юзер скажет, что хочет забронировать с субботы до вс, то по идее он имеет в виду свободный номер с 12:00 субботы, а он занят до 12:00 субботы. Вот это нужно тоже протестить! Спасибо)
Не в сети
Страницы 1