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

单表单创建多数据表报错: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');
}
问题排查与解决

核心问题

  1. 未正确获取modulkelas的ID:第一个循环中调用ModulKelas::create($modulkelas)后,没有将创建后的模型实例保存下来,$modulkelas数组里根本不存在id_modulkelas键,第二个循环调用时直接触发未定义索引的错误。
  2. 业务关联逻辑错误:如果$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:50:56