单表单创建多数据表报错:tugas表数据插入失败
问题描述
通过表单创建数据并插入3张关联数据表,目前kelas和modulkelas表的数据已成功创建,但向tugas表插入数据时失败,报错信息见附图。表间关系详见附图,控制器代码如下:
public function storeKelas(Request $request) { $req = $request->all(); $idkel = $request->matkul; $allmodul = $this->idModul($idkel); $jenistugas = ['pre_test', 'post_test', 'laporan']; $kelas = new Kelas(); $kelas->id_periode = $req['id_periode']; $kelas->id_matkul = $req['matkul']; $kelas->id_dosen = $req['dosen']; $kelas->nama_kelas = $req['name']; $kelas->kode_matkul = $req['kode']; $kelas->save(); foreach ($allmodul as $modul) { $modulkelas = [ 'id_kelas' => $kelas->id_kelas, 'id_modul' => $modul, 'created_by' => Session::get('user_id'), 'id_periode' => $req['id_periode'], ]; ModulKelas::create($modulkelas); } foreach ($jenistugas as $key => $tugas) { $tugasmodul = [ 'id_kelas' => $kelas->id_kelas, 'jenis' => $tugas, 'id_periode' => $req['id_periode'], 'id_modulkelas' => $modulkelas['id_modulkelas'], 'created_by' => Session::get('user_id'), ]; Tugas::create($tugasmodul); } return redirect('kelas')->with('success', 'Kelas Baru Sudah dibuat'); }
问题排查与解决
核心问题
- 未正确获取
modulkelas的ID:第一个循环中调用ModulKelas::create($modulkelas)后,没有将创建后的模型实例保存下来,$modulkelas数组里根本不存在id_modulkelas键,第二个循环调用时直接触发未定义索引的错误。 - 业务关联逻辑错误:如果
$allmodul包含多个模块,当前代码只会用最后一次循环的$modulkelas(还无有效ID)创建任务,不符合业务逻辑——应该是每个模块对应一组三种类型的任务,而非所有模块共用同一组任务。
修复后的代码
public function storeKelas(Request $request) { $req = $request->all(); $idkel = $request->matkul; $allmodul = $this->idModul($idkel); $jenistugas = ['pre_test', 'post_test', 'laporan']; // 直接用create创建Kelas并返回实例,写法更简洁 $kelas = Kelas::create([ 'id_periode' => $req['id_periode'], 'id_matkul' => $req['matkul'], 'id_dosen' => $req['dosen'], 'nama_kelas' => $req['name'], 'kode_matkul' => $req['kode'], ]); // 遍历每个模块,创建关联后立即生成对应任务 foreach ($allmodul as $modul) { // 创建ModulKelas并获取实例,拿到自动生成的ID $modulkelas = ModulKelas::create([ 'id_kelas' => $kelas->id_kelas, 'id_modul' => $modul, 'created_by' => Session::get('user_id'), 'id_periode' => $req['id_periode'], ]); // 为当前模块创建三种类型的任务 foreach ($jenistugas as $tugas) { Tugas::create([ 'id_kelas' => $kelas->id_kelas, 'jenis' => $tugas, 'id_periode' => $req['id_periode'], 'id_modulkelas' => $modulkelas->id_modulkelas, // 使用模型实例的ID 'created_by' => Session::get('user_id'), ]); } } return redirect('kelas')->with('success', 'Kelas Baru Sudah dibuat'); }
额外优化建议
建议添加数据库事务,确保数据一致性——要么三张表都插入成功,要么全部回滚,避免出现部分数据插入的异常情况:
use Illuminate\Support\Facades\DB; public function storeKelas(Request $request) { $req = $request->all(); $idkel = $request->matkul; $allmodul = $this->idModul($idkel); $jenistugas = ['pre_test', 'post_test', 'laporan']; DB::beginTransaction(); try { $kelas = Kelas::create([ 'id_periode' => $req['id_periode'], 'id_matkul' => $req['matkul'], 'id_dosen' => $req['dosen'], 'nama_kelas' => $req['name'], 'kode_matkul' => $req['kode'], ]); foreach ($allmodul as $modul) { $modulkelas = ModulKelas::create([ 'id_kelas' => $kelas->id_kelas, 'id_modul' => $modul, 'created_by' => Session::get('user_id'), 'id_periode' => $req['id_periode'], ]); foreach ($jenistugas as $tugas) { Tugas::create([ 'id_kelas' => $kelas->id_kelas, 'jenis' => $tugas, 'id_periode' => $req['id_periode'], 'id_modulkelas' => $modulkelas->id_modulkelas, 'created_by' => Session::get('user_id'), ]); } } DB::commit(); return redirect('kelas')->with('success', 'Kelas Baru Sudah dibuat'); } catch (\Exception $e) { DB::rollBack(); return redirect()->back()->with('error', '创建失败:'.$e->getMessage()); } }
内容的提问来源于stack exchange,提问作者roktrokt15
相关产品推荐
相关产品推荐

