求助: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
相关产品推荐
相关产品推荐

