Laravel控制器生成多年级考勤JSON响应问题解决
Laravel TODreport 方法修复:返回所有年级考勤数据及学校整体统计
问题根源
循环过程中直接将单年级数据赋值给变量,每次循环都会覆盖之前的内容,最终只保留最后一次循环的结果。
修复步骤
- 初始化空数组存储所有年级数据,每次循环把当前年级的统计结果追加进去
- 同步计算学校整体统计数据(要么循环内累加各年级指标,要么直接查询全校范围数据)
- 把所有年级数据和整体统计合并成一个响应结构返回
代码示例
错误版本(仅返回最后一个年级)
public function TODreport() { $school = Auth::user()->school; $gradeLevels = $school->stage === 'primary' ? ['1','2','3','4','5','6'] : ['7','8','9']; $gradeData = []; foreach ($gradeLevels as $grade) { // 每次循环覆盖$gradeData,最终只剩最后一个年级 $gradeData = Attendance::where('school_id', $school->id) ->where('grade', $grade) ->selectRaw('SUM(CASE WHEN status = "present" THEN 1 ELSE 0 END) as present_count') ->selectRaw('SUM(CASE WHEN status = "absent" THEN 1 ELSE 0 END) as absent_count') ->first() ->toArray(); $gradeData['grade'] = $grade; } return response()->json($gradeData); }
修复后版本(返回所有年级+整体统计)
public function TODreport() { $school = Auth::user()->school; $gradeLevels = $school->stage === 'primary' ? ['1','2','3','4','5','6'] : ['7','8','9']; $gradeReports = []; // 初始化学校整体统计 $schoolTotal = [ 'present_count' => 0, 'absent_count' => 0 ]; foreach ($gradeLevels as $grade) { // 查询当前年级考勤统计 $stats = Attendance::where('school_id', $school->id) ->where('grade', $grade) ->selectRaw('SUM(CASE WHEN status = "present" THEN 1 ELSE 0 END) as present_count') ->selectRaw('SUM(CASE WHEN status = "absent" THEN 1 ELSE 0 END) as absent_count') ->first() ->toArray(); // 处理空统计值,避免null导致累加错误 $stats['present_count'] = $stats['present_count'] ?? 0; $stats['absent_count'] = $stats['absent_count'] ?? 0; // 组装单年级数据并追加到数组 $gradeReport = array_merge($stats, ['grade' => $grade]); $gradeReports[] = $gradeReport; // 累加至学校整体统计 $schoolTotal['present_count'] += $stats['present_count']; $schoolTotal['absent_count'] += $stats['absent_count']; } // 也可以直接查询全校数据(数据量大时性能更优) // $schoolTotal = Attendance::where('school_id', $school->id) // ->selectRaw('SUM(CASE WHEN status = "present" THEN 1 ELSE 0 END) as present_count') // ->selectRaw('SUM(CASE WHEN status = "absent" THEN 1 ELSE 0 END) as absent_count') // ->first() // ->toArray(); // 组装最终响应结构 $response = [ 'school_overall' => $schoolTotal, 'grade_reports' => $gradeReports ]; return response()->json($response); }
关键说明
- 用
$gradeReports[] = $gradeReport替代直接赋值,确保所有年级数据都被保留 - 空值处理
?? 0避免统计结果为null时出现计算错误 - 学校整体统计可以选择循环累加或直接查询,后者在数据量大时更高效
内容的提问来源于stack exchange,提问作者deo_gemini
相关产品推荐
相关产品推荐

