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
相关产品推荐
相关产品推荐

