Laravel 5.1 获取 start_time 和 end_time 之间的行(两个不同的字段)
Laravel 5.1 Fetch Rows between start_time and end_time (two different fields)
我一直致力于预订项目,我收集请求(time_start 和 time_end)并为每个请求增加 1:30 小时,这样我就可以防止用户 select 冲突。
我已经尝试使用 "Between",但它似乎不起作用。
->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)
当我执行我的代码时,它 returns 为空。请帮忙。
您可以使用 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();
通过上述查询,您将获得给定时间范围内的预订。
希望你明白。
更新
您的情况,您在预订时需要考虑以下情况。
- 在给定时间范围内开始预订。
- 预订在给定的时间范围内结束。
- 预订在给定时间范围内开始和结束。
我一直致力于预订项目,我收集请求(time_start 和 time_end)并为每个请求增加 1:30 小时,这样我就可以防止用户 select 冲突。
我已经尝试使用 "Between",但它似乎不起作用。
->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)
当我执行我的代码时,它 returns 为空。请帮忙。
您可以使用 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();
通过上述查询,您将获得给定时间范围内的预订。
希望你明白。
更新
您的情况,您在预订时需要考虑以下情况。
- 在给定时间范围内开始预订。
- 预订在给定的时间范围内结束。
- 预订在给定时间范围内开始和结束。