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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:55:18