Laravel中如何提交同名字段表单并向数据库插入多条数据
问题根源
你当前两个下拉框都使用了相同的数组名ki_kd_id[],表单提交后后端拿到的$request->ki_kd_id是长度为2的数组,偶数索引对应Kompetensi Dasar的选中值,奇数索引对应Kompetensi Inti的选中值。你原有逻辑中每条mapel记录仅取ki_kd_id的一个索引值,会出现值不匹配或者漏存的问题。
解决方案
根据你的业务需求选择对应方案即可:
方案1:每条mapel记录同时关联KD和KI
如果你的业务逻辑要求单条课程记录同时绑定核心能力(KI)和基础能力(KD),按以下步骤修改:
- 调整数据表结构,新增
ki_id字段,将原有ki_kd_id字段重命名为kd_id,调整后表结构如下:id | nama_mapel | guru_id | kode_mapel | kd_id | ki_id - 修改视图层下拉框命名,区分两个选择器:
<!-- 原选择Kompetensi Dasar的下拉框 --> <select name="kd_id[]"> <option value disable>Pilih Kompetensi Dasar</option> @foreach ($komp_dasar as $kd) <option value="{{ $kd->id }}">{{ $kd->kompetensi }}</option> @endforeach </select> <!-- 原选择Kompetensi Inti的下拉框 --> <select type="text" name="ki_id[]"> <option value disable>Pilih Kompetensi Inti</option> @foreach ($komp_inti as $ki) <option value="{{ $ki->id }}">{{ $ki->kompetensi }}</option> @endforeach </select> - 修改控制器存储逻辑:
public function store(Request $request) { $nama_mapel = $request->nama_mapel; $guru_id = $request->guru_id; $kode_mapel = $request->kode_mapel; $kd_id = $request->kd_id; $ki_id = $request->ki_id; foreach ($nama_mapel as $row => $key){ $data= [ 'nama_mapel' => $nama_mapel[$row], 'guru_id' => $guru_id[$row], 'kode_mapel' => $kode_mapel[$row], 'kd_id' => $kd_id[$row], 'ki_id' => $ki_id[$row], ]; DB::table('mapel')->insert($data); } return redirect()->back(); }
方案2:KD和KI分别作为独立的mapel记录存储
如果你的业务逻辑要求KD和KI各自作为一条独立的课程记录存储,不需要修改表结构和视图代码,直接调整控制器逻辑即可:
public function store(Request $request) { $nama_mapel = $request->nama_mapel; $guru_id = $request->guru_id; $kode_mapel = $request->kode_mapel; $ki_kd_id = $request->ki_kd_id; foreach ($nama_mapel as $row => $key){ // 存储Kompetensi Dasar记录 DB::table('mapel')->insert([ 'nama_mapel' => $nama_mapel[$row], 'guru_id' => $guru_id[$row], 'kode_mapel' => $kode_mapel[$row], 'ki_kd_id' => $ki_kd_id[$row * 2], ]); // 存储Kompetensi Inti记录 DB::table('mapel')->insert([ 'nama_mapel' => $nama_mapel[$row], 'guru_id' => $guru_id[$row], 'kode_mapel' => $kode_mapel[$row], 'ki_kd_id' => $ki_kd_id[$row * 2 + 1], ]); } return redirect()->back(); }
内容的提问来源于stack exchange,提问作者Catto
相关产品推荐
相关产品推荐

