Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel查询生成器不允许在诸如mysql之类的查询之间进行交互_Php_Mysql_Laravel_Query Builder - Fatal编程技术网

Php laravel查询生成器不允许在诸如mysql之类的查询之间进行交互

Php laravel查询生成器不允许在诸如mysql之类的查询之间进行交互,php,mysql,laravel,query-builder,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', '=', $time

我想使用当前时间和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\u start和$shift\u end是用户输入值。使用这段代码,我检查计数是否为0,时间是否重叠

所以我尝试添加时间$shift\u start:4:20和$shift\u end 4:40,但是在这个查询中,它的返回没有重叠。但它应该重叠表当前的时间偏移为4到5(开始时间04:00结束时间05:00)


请告诉我如何使用上述场景继续此查询,正如您所发现的,
whereBetween()
方法不支持检查值是否在数据库中的字段之间,它只检查数据库中的字段是否在两个值之间

因此,最简单的选择就是重写where子句,手动使用
=
id)
->其中('user\u id','=',$driver\u id->id)
->其中('role_id','=',1)
->其中(函数($q1)使用($shift\U start,$shift\U end){
$q1
->其中(功能($q2)使用($shift\U start){
q2美元
->其中('shift_start_time'、'='、$shift_start');
})
->orWhere(功能($q2)使用($shift\U end){
q2美元
->其中('shift\u start\u time'、'='、$shift\u end');
});
})
->计数();

正如您所发现的,
whereBetween()
方法不支持检查值是否在数据库中的字段之间,它只检查数据库中的字段是否在两个值之间

因此,最简单的选择就是重写where子句,手动使用
=
id)
->其中('user\u id','=',$driver\u id->id)
->其中('role_id','=',1)
->其中(函数($q1)使用($shift\U start,$shift\U end){
$q1
->其中(功能($q2)使用($shift\U start){
q2美元
->其中('shift_start_time'、'='、$shift_start');
})
->orWhere(功能($q2)使用($shift\U end){
q2美元
->其中('shift\u start\u time'、'='、$shift\u end');
});
})
->计数();

如果要复制以使用完整sql,可以在触发count()之前使用方法toSql@Svetlio:你是说我尝试过的MySQL查询?是的,只是想看看生成了什么以及您希望它是什么样子。您的数据库中的
shift\u start\u time
shift\u end\u time
列是什么数据类型?它们是varchar2吗?您的数据库中的
shift\u start\u time
是什么类型,以及
$shift\u start
的格式是什么?您能否复制以使用完整的sql,您可以在触发count()之前使用方法toSql@Svetlio:你是说我尝试过的MySQL查询?是的,只是想看看生成了什么以及您希望它是什么样子。您的数据库中的
shift\u start\u time
shift\u end\u time
列是什么数据类型?它们是varchar2吗?数据库中的
shift\u start\u time
是什么类型,以及
$shift\u start
的格式是什么?
$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();