我有多个大厅。我必须搜索大厅,以提供给定的日期和时间。我如何使用laravel查询从数据中查找可用日期。
$getData = Booking::where('category_id', '=', $categoryID)->
where('booking_time', '=', $time)
->whereDate('date_from', '>=', $startDate)
->whereDate('date_to', '<=', $endDate)
->get();
答案 0 :(得分:0)
为了知道可用日期,您需要1)考虑日期范围,以及2)不可用日期。然后比较一下。
您可以在数据库中创建一个日历表,其中存储下一个x年的所有日期,然后将其与您的预订进行比较。或者,您可以在PHP中这样做,例如:
$availableDates['morning'] = iterator_to_array(new DatePeriod(
new DateTime('2019-01-01'),
new DateInterval('P1D'),
new DateTime('2019-12-31')
));
$availableDates['afternoon'] = $availableDates['morning'];
$unavailableDates = [];
foreach(Booking::where('category_id', $category_id)->get() as $booking) {
$unavailableDates[$booking->booking_time] += iterator_to_array(new DatePeriod(
new DateTime($booking->date_from),
new DateInterval('P1D'),
new DateTime($booking->date_to)
));
}
function compareDates(DateTime $a, DateTime $b) { return $a->getTimestamp() - $b->getTimestamp(); }
$available['morning'] = array_udiff($availableDates['morning'],$unavailableDates,'compareDates');
$available['afternoon'] = array_udiff($availableDates['afternoon'],$unavailableDates,'compareDates');
通过消除几个循环可能会获得一些效率,但这应该可以帮助您入门。