Php Laravel group by子句

Php Laravel group by子句,php,laravel,eloquent,laravel-query-builder,Php,Laravel,Eloquent,Laravel Query Builder,我有一个非常困难的情况,我一直试图找到一个解决方案,要么与查询生成器或雄辩,但没有运气好几天 我有一个数据库表/雄辩模型“出勤”,包含以下字段: id、员工id、时间表id、出勤时间“日期时间” 此表表示特定分支中每个员工的指纹日志 timesheet_id:表示员工白天的工作班次,我有两个: 一个从早上6点到下午3点 从下午3点到第二天凌晨12点的两次“导致问题的原因” 现在我想做一份月度报告,在特定的时间段(比如从2020年9月1日到2020年9月30日)获取此表中的所有数据,这对于轮班

我有一个非常困难的情况,我一直试图找到一个解决方案,要么与查询生成器或雄辩,但没有运气好几天

我有一个数据库表/雄辩模型“出勤”,包含以下字段:

id、员工id、时间表id、出勤时间“日期时间”

此表表示特定分支中每个员工的指纹日志

timesheet_id:表示员工白天的工作班次,我有两个:

  • 一个从早上6点到下午3点
  • 从下午3点到第二天凌晨12点的两次“导致问题的原因”
现在我想做一份月度报告,在特定的时间段(比如从2020年9月1日到2020年9月30日)获取此表中的所有数据,这对于轮班工作的员工来说非常容易,但对于那些在第二班工作的人来说,这有点困难,因为当按日期对记录进行分组时——他们注销的记录很可能在第二天——如果有意义的话,将不会与该日期分组

让我们以2020年9月26日的员工#3记录为例:

请看,每天的第一条记录是前一天的注销记录,第二条是当天的登录记录,这意味着如果该员工只有一条记录,我必须检查时间,如果它小于或等于上午6点,则表示它是前一天的注销记录,否则它是当天的登录记录

我尝试的是,我抓取从01-09-2020 00:00:00到01-10-2020 06:00:00的所有记录,以便捕获30-09的注销,然后按出勤时间分组,但在按日期分组时,如何检查员工在第二天是否有注销记录

$start = "2020/09/01 00:00:00";
$end = "2020/10/01 06:00:00";
$branch_id = 1;
$timesheet = 2; // employees who work from 3pm to 00 am

$attendances = Attendance::oldest()
                ->where([
                    'timesheet_id' => $timesheet
                ])
                ->whereHas('employee', function ($q) use ($branch_id) {
                    $q->where('branch_id', $branch_id);
                })
                ->whereBetween('attendance_time', [$start, $end])
                ->where('employee_id', 3)
                ->get(['employee_id', 'attendance_time']);

$monthly = $attendances->groupBy(function ($item) {
               return $item->attendance_time->toDateString();
            });

我知道这很复杂,如果有人能帮我的话,我会非常感激。

与其按日期分组(从上午12点到凌晨12点),不如按日期分组(从早上6点到早上6点)减去出勤时间(从早上6点到早上6点)。您可能需要将DB::raw(“”)与mysql DATE_格式和DATE_SUB或您选择的其他DB一起使用。