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

Laravel中如何将多选课程数据存储到SQL数据库多行?

Laravel 多选课程动态存储解决方案

1. 调整数据库表结构

将原assigncourses表中course1、course2、course3三个固定字段替换为单个course_id外键,让一行记录对应一条老师-课程分配关系:

创建迁移文件执行表结构修改:

Schema::table('assigncourses', function (Blueprint $table) {
    $table->dropColumn(['course1', 'course2', 'course3']);
    $table->unsignedBigInteger('course_id');
    $table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');
});

执行迁移命令:

php artisan migrate

2. 更新Assigncourse模型

修改app/Models/Assigncourse.php的可填充字段,适配新表结构:

protected $fillable = ['teacher_id', 'session', 'semester', 'course_id'];

3. 重构控制器Store方法

替换原有固定存储逻辑,实现动态批量存储:

public function store(Request $r)
{
    // 验证请求数据合法性
    $r->validate([
        'teacher_id' => 'required|exists:teachers,id',
        'session' => 'required',
        'semester' => 'required',
        'course_code' => 'required|array|exists:courses,id'
    ]);

    $courseIds = $r->course_code;
    $assignRecords = [];

    // 批量组装分配记录
    foreach ($courseIds as $id) {
        $assignRecords[] = [
            'teacher_id' => $r->teacher_id,
            'session' => $r->session,
            'semester' => $r->semester,
            'course_id' => $id,
            'created_at' => now(),
            'updated_at' => now()
        ];
    }

    // 批量插入分配数据
    Assigncourse::insert($assignRecords);

    // 批量更新课程状态
    DB::table('courses')
        ->whereIn('id', $courseIds)
        ->update(['status' => 1]);

    return redirect()->back()->with('msg', 'Successfully Inserted');
}

4. 视图保持不变

现有视图的name="course_code[]"已经正确提交多选数组,无需修改。

核心改进

  • 摆脱最多3门课程的限制,支持任意数量的课程选择
  • 采用批量操作提升数据库写入性能
  • 新增数据验证,避免非法数据写入
  • 符合数据库规范化设计,消除冗余字段

内容的提问来源于stack exchange,提问作者1641_Shourav Chy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:30:57