我想使用当前时间与db数据检查时间重叠。这是我为检查班次时间重叠做的,这里是我的数据库表的例子
1 )date:1 shift:1 start_time 04:00 end_time 05:00
2)date:1 shift: 2 start_time 09:00 end_time 11:00
特定的一天有几个班次,当有人编辑或添加班次换班一天我想检查其重叠
这是我的代码
$shiftData = Shifts::where('time_sheet_id', '=', $timesheet_id->id)
->where('user_id', '=', $driver_id->id)
->where('role_id', '=', 1)
->whereBetween('shift_start_time', array($shift_start , $shift_end))
->whereBetween('shift_end_time' , array($shift_start , $shift_end))
->count();
$ shift_start和$ shift_end是用户输入值。使用此代码,我检查计数是否为0时间不重叠。
所以我尝试添加时间$ shift_start:4:20和$ shift_end 4:40,但是这个查询的返回值不重叠。但它应该重叠表目前有时间转移到4到5(start_time 04:00 end_time 05:00)
请告诉我如何使用以上方案继续此查询
答案 0 :(得分:3)
正如您所知,whereBetween()
方法不支持检查数据库中的字段之间是否存在值,它只检查数据库中的字段是否介于两个值之间。
因此,最简单的选择就是重写where子句以手动使用>=
和<=
运算符。
尝试类似:
$shiftData = Shifts::where('time_sheet_id', '=', $timesheet_id->id)
->where('user_id', '=', $driver_id->id)
->where('role_id', '=', 1)
->where(function($q1) use ($shift_start, $shift_end) {
$q1
->where(function($q2) use ($shift_start) {
$q2
->where('shift_start_time', '<=', $shift_start)
->where('shift_end_time', '>=', $shift_start);
})
->orWhere(function($q2) use ($shift_end) {
$q2
->where('shift_start_time', '<=', $shift_end)
->where('shift_end_time', '>=', $shift_end);
});
})
->count();