Laravel 8 学生成绩批量插入数据库的控制器编写问题
批量保存学生成绩解决方案
1 前端表单修改
你当前的表单输入项没有设置为数组格式,提交时只会保留最后一行学生的数据,需要把所有输入字段的name属性改为数组格式,修改后的循环内输入部分代码如下:
@foreach($semester_students as $key => $semester_student) <tr data-widget="expandable-table" aria-expanded="false"> <td> <input type="hidden" name="student_id[]" value="{{ $semester_student->id }}" class="form-control"> </td> <td><img class="img-circle img-bordered-sm" src="" alt="U" width="50"></td> <td>{{$semester_student->registration_number}}</td> <td>{{$semester_student->roll_number}}</td> <td>{{$semester_student->firstname}} {{$semester_student->lastname}}</td> <td> <input type="text" name="attendance[]" placeholder="输入分数" class="form-control"> </td> <td> <input type="text" name="class_test[]" placeholder="输入分数" class="form-control"> </td> <td> <input type="text" name="parta[]" placeholder="输入分数" class="form-control"> </td> <td> <input type="text" name="partb[]" placeholder="输入分数" class="form-control"> </td> </tr> @endforeach
2 控制器逻辑编写
控制器对应方法代码如下(假设你的成绩表模型为StudentResult,可替换为你项目实际的模型名):
use Illuminate\Support\Facades\DB; use App\Models\StudentResult; public function addAllStudentResults(Request $request, $session_id, $semester_id, $course_id, $course_credit) { // 校验提交数据合法性 $request->validate([ 'student_id' => 'required|array', 'student_id.*' => 'exists:students,id', // 学生表名如果不是students请自行修改 'attendance' => 'required|array', 'attendance.*' => 'numeric|min:0|max:10', // 分值范围可根据你的实际规则调整 'class_test' => 'required|array', 'class_test.*' => 'numeric|min:0|max:20', 'parta' => 'required|array', 'parta.*' => 'numeric|min:0|max:30', 'partb' => 'required|array', 'partb.*' => 'numeric|min:0|max:40', ]); // 开启事务保证数据一致性,要么全部保存成功要么全部回滚 DB::beginTransaction(); try { $insertData = []; foreach ($request->student_id as $key => $studentId) { $insertData[] = [ 'session_id' => $session_id, 'semester_id' => $semester_id, 'course_id' => $course_id, 'course_credit' => $course_credit, 'student_id' => $studentId, 'attendance' => $request->attendance[$key], 'class_test' => $request->class_test[$key], 'parta' => $request->parta[$key], 'partb' => $request->partb[$key], 'created_at' => now(), 'updated_at' => now(), ]; } // 批量插入,性能远优于循环单条插入 StudentResult::insert($insertData); DB::commit(); // 保存成功跳转逻辑,可自行调整 return back()->with('success', '所有学生成绩保存成功'); } catch (\Exception $e) { DB::rollBack(); // 保存失败反馈逻辑 return back()->with('error', '成绩保存失败,请重试:'.$e->getMessage()); } }
注意事项
- 请自行替换代码中的模型名、表名字段为你实际项目的对应名称
- 验证规则里的分值范围请根据你实际的成绩配置调整
- 如果需要支持修改已有的成绩,可以先查询对应学期、课程下的成绩记录,存在就更新,不存在再插入
内容的提问来源于stack exchange,提问作者joy dhar
相关产品推荐
相关产品推荐

