laravel查询生成器不允许执行像mysql这样的BETWEEN查询

时间:2015-11-18 15:47:27

标签: php mysql laravel query-builder

我想使用当前时间与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)

请告诉我如何使用以上方案继续此查询

1 个答案:

答案 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();