Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 17.03.2019 02:48:47

Проверить, снят ли номер на данный диапозон дат.

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

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;
            }

Не в сети

#2 17.03.2019 07:24:22

Re: Проверить, снят ли номер на данный диапозон дат.

А зачем тебе проверять именно диапазон? Было бы логичней проверять занят ли номер на конкретную дату, а там уже смотреть,  на какой срок он занят.

Не в сети

#3 17.03.2019 08:56:46

Re: Проверить, снят ли номер на данный диапозон дат.

Нормальный вопрос. При попытке бронирования надо проверить номера на выбранном периоде.
Если период включает в себя границы, то можно так сформулировать:
Два периода 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.

Не в сети

#4 17.03.2019 09:01:18

Re: Проверить, снят ли номер на данный диапозон дат.

Тут нюанс именно в способе представления даты "По". Когда человеку надо одну ночь переночевать, он указывает, что номер нужен с пятницы по субботу, например. Это одна ночь, а форме ввода оно выглядит как две разные даты. При этом хранить в базе такие периоды удобно как две одинаковые даты.

Надеюсь понятно сформулировал sad


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#5 17.03.2019 11:07:43

Re: Проверить, снят ли номер на данный диапозон дат.

удобно как две одинаковые даты.

Про это я не подумал. Вроде бы да, но тут все зависит от формулировки и про это я не подумал. В форме я указываю это, как "дата вьезда" и "дата выезда" и тут все логично. Но номер будет забронирован по факту с даты вьезда по дату выезда минус один день.
Но я храню в datetime ведь и когда следующий юзер скажет, что хочет забронировать с субботы до вс, то по идее он имеет в виду свободный номер с 12:00 субботы, а он занят до 12:00 субботы. Вот это нужно тоже протестить! Спасибо)

Не в сети

Подвал раздела