You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Laravel 5.5中如何获取月度考勤报表数据

解决Laravel 5.5中月度考勤报表数据获取问题

嘿,看起来你在Laravel 5.5里做月度考勤报表的时候卡壳了,我来帮你捋清楚怎么搞定这个问题!首先看你给出的查询代码,已经有了核心思路,但有几个地方需要调整和补全,才能顺利拿到想要的数据。

首先,补全并修正你的基础查询

你的代码里groupBy('employee_n...')被截断了,而且直接用select('attendance_management.*')在开启MySQL严格模式的情况下会报错(Laravel 5.5默认开启严格模式),因为ONLY_FULL_GROUP_BY要求分组后的查询字段要么在groupBy里,要么是聚合函数。这里给你补全并修正后的代码:

$year = 2024; // 替换成你实际的年份变量,比如从请求中获取
$month = 10;  // 替换成你实际的月份变量

$data = DB::table("attendance_management")
    ->select(
        // 明确指定员工的唯一标识字段,比如employee_id或者employee_number,不能用*
        'employee_id', 
        // 用group_concat合并考勤记录,指定排序和分隔符更清晰
        DB::raw('group_concat(attendance ORDER BY date SEPARATOR ", ") as attendance_records'),
        // 合并对应的日期
        DB::raw('group_concat(date ORDER BY date SEPARATOR ", ") as attendance_dates')
    )
    ->whereYear('date', '=', $year)
    ->whereMonth('date', '=', $month)
    // 必须按员工唯一标识分组,确保每个员工的考勤记录被归为一组
    ->groupBy('employee_id')
    ->get();

关键注意事项

  • 替换字段名:把代码里的employee_id替换成你表中实际的员工唯一标识字段(比如employee_number),这是分组的核心,不能出错。
  • **避免select ***:不要直接用attendance_management.*,因为里面大部分字段不在groupBy中,会触发ONLY_FULL_GROUP_BY的报错。只选择你需要的员工信息字段(比如员工ID、姓名)和聚合后的考勤数据。
  • 处理严格模式报错:如果运行时遇到SQLSTATE[42000]: Syntax error or access violation: 1055错误,优先调整查询(确保select的字段都在groupBy里或者是聚合函数),这是符合SQL规范的做法。如果确实需要临时关闭该模式,可以修改config/database.php中的mysql配置:
    'mysql' => [
        // ...其他配置
        'strict' => true,
        'modes' => [
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_AUTO_CREATE_USER',
            // 移除ONLY_FULL_GROUP_BY这一行
        ],
    ],
    

进阶:添加考勤统计维度

如果需要统计每个员工的出勤、迟到、旷工天数,可以扩展查询,加入更多聚合函数:

$year = request()->input('year');
$month = request()->input('month');

$attendanceReport = DB::table("attendance_management")
    // 如果有员工表,关联获取员工姓名等信息
    ->join('employees', 'attendance_management.employee_id', '=', 'employees.id')
    ->select(
        'employees.id as employee_id',
        'employees.name as employee_name',
        DB::raw('group_concat(attendance ORDER BY date SEPARATOR ", ") as attendance_records'),
        DB::raw('group_concat(date ORDER BY date SEPARATOR ", ") as attendance_dates'),
        DB::raw('COUNT(*) as total_work_days'),
        DB::raw('COUNT(CASE WHEN attendance = "present" THEN 1 END) as present_days'),
        DB::raw('COUNT(CASE WHEN attendance = "absent" THEN 1 END) as absent_days'),
        DB::raw('COUNT(CASE WHEN attendance = "late" THEN 1 END) as late_days')
    )
    ->whereYear('attendance_management.date', '=', $year)
    ->whereMonth('attendance_management.date', '=', $month)
    ->groupBy('employees.id', 'employees.name')
    ->get();

这样你就能拿到每个员工完整的月度考勤明细和统计数据了,直接用这个结果渲染报表就行。

内容的提问来源于stack exchange,提问作者Akash Bhavsar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:17:34