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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 21:39:03