Laravel PHP构建指定结构的对象数组响应问题
修正Laravel代码以生成期望的学生成绩数组结构
问题分析
你的代码存在以下关键问题,导致输出结构不符合预期:
- 未遍历查询到的学生列表(
$usersData),没有为每个学生单独生成科目成绩数据 $subjectsArray未在每个学生的循环内初始化,会导致不同学生的科目数据互相累加- 最终数组的组织逻辑错误,没有按照「每个学生为一个对象,包含姓名和对应科目列表」的结构构建
修正后的代码
// 查询符合条件的学生列表 $usersData = User::where('user_id', 2) ->where("stud_class", $exam_details->exam_class_id) ->where("XXXX", $exam_details->exam_branch_id) ->get(); // 初始化最终的学生数组 $studentsArray = []; // 遍历每个学生 foreach ($usersData as $student) { // 每个学生单独初始化科目数组,避免数据污染 $subjectsArray = []; // 遍历每个科目,计算该学生的对应成绩 foreach ($exam_data as $subject) { $att_exams = MODEL::where('XXXXX', $subject->subject_id) ->where('XXXX', $student->id) // 关联当前循环的学生ID ->first(); if ($att_exams) { $marks = MODEL::where('XXXX', $att_exams->attended_exams_id)->get(); $right = 0; $wrong = 0; $total_marks = $marks->sum('XXXX'); $total_negative_marks = $wrong * $subject->negative_marks; $subjectsArray[] = [ "subject" => $subject->subject_name, "marks_" => $total_marks - $total_negative_marks, ]; } else { $subjectsArray[] = [ "subject" => $subject->subject_name, "marks_" => 0, ]; } } // 将当前学生的信息和科目成绩加入最终数组 $studentsArray[] = [ "student" => $student->name, // 替换为实际存储学生姓名的字段名 "subjects" => $subjectsArray ]; } return $studentsArray;
关键调整说明
- 遍历学生列表:新增对
$usersData的循环,确保每个学生都生成独立的成绩数据 - 重置科目数组:在每个学生的循环内初始化
$subjectsArray,避免不同学生的科目数据混淆 - 修正结构赋值:每个学生项以
["student" => "...", "subjects" => [...]]的格式加入$studentsArray,完全匹配你期望的JSON结构 - 修正学生ID引用:将原代码中的
$user->id改为$student->id,确保关联当前循环的学生
内容的提问来源于stack exchange,提问作者Swapnil Mane
相关产品推荐
相关产品推荐

