我一直在处理预订项目,我收集请求(time_start和time_end)并每次增加1:30小时,以防止用户选择冲突。
我尝试过使用“之间”但它似乎没有用。
->whereBetween('reservation_time_start', [$time_from, $time_to])
->whereBetween('reservation_time_end', [$time_from, $time_to])
我也尝试了这个,
->whereRaw('((reservation_time_end <= ? AND reservation_time_end >= ?) OR (reservation_time_start >= ? AND reservation_time_start <= ?))',[$time_end, $time_start,$time_start, $time_end])
它可以工作,但在某些情况下,如某些时间范围之间,我得不到任何结果。喜欢这个。
+----+------------------------+----------------------+
| id | reservation_time_start | reservation_time_end |
+----+------------------------+----------------------+
| 1 | 10:00:00 | 13:00:00 | <- i need to get this
| 2 | 12:00:00 | 14:00:00 |
| 3 | 14:00:00 | 15:00:00 |
+----+------------------------+----------------------+
示例用户输入:
$reservation_time_start = 12:00:00 (-1:30 Hour)
$reservation_time_end = 14:00:00 (+ 1:30 hour)
当我执行我的代码时,它返回null。请帮忙。
答案 0 :(得分:2)
您可以使用Carbon解决问题,
您的用户输入时间为:
$reservation_time_start = 12:00:00;
$reservation_time_end = 14:00:00;
我建议您使用日期和时间,因此您的用户输入应为
$reservation_time_start = 2017-07-18 12:00:00;
$reservation_time_end = 2017-07-18 14:00:00;
现在,用Carbon解析这些时间。之后,分别从结束时间和开始时间的1:30开始添加和减去。
$start_time = Carbon::parse($reservation_time_start)->subMinutes(90);
$end_time = Carbon::parse($reservation_time_end)->addMinutes(90);
之后,您可以使用这样的简单查询,
DB::table('reservation')->where(function($query)
use($start_time,$end_time){
$query->where('reservation_time_start','>',$start_time)
->where('reservation_time_start','<',$end_time);
})
->orWhere(function($query) use($start_time,$end_time){
$query->where('reservation_time_end','>',$start_time)
->where('reservation_time_end','<',$end_time);
})
->get();
从上面的查询中,您将在给定的时间范围内获得预订。
希望你明白。
<强>更新强>
在您的情况下,您必须在预订中考虑以下案例。