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

Laravel数据存储异常求助:如何实现预期的数据库存储格式

问题分析与解决方案

你的代码存在两个核心问题,导致数据存储不符合预期:

1. 变量名错误

你将请求中的date赋值给了$data变量,但后续创建模型时使用的是未定义的$date,这会导致date字段存入空值或直接报错。先修正变量名:

$date = $request->date; // 把$data改为$date
$sub_kriteria_id = $request->sub_kriteria_id;
$karyawan_id = $request->karyawan_id;
$nilai = $request->nilai;
$kriteria = $request->kriteria;

2. 嵌套循环逻辑错误

当前的双层循环会让每个nilai值对应所有的karyawan_id和sub_kriteria_id,导致大量重复数据插入,不符合"员工、子准则、评分一一对应"的预期逻辑。正确的做法是:假设员工ID、子准则ID、评分是长度一致的数组,遍历其中一个数组,用相同索引取对应位置的值。

修正后的完整代码:

$date = $request->date;
$sub_kriteria_id = $request->sub_kriteria_id;
$karyawan_id = $request->karyawan_id;
$nilai = $request->nilai;

// 先验证三个数组长度一致,避免索引越界
if (count($karyawan_id) !== count($sub_kriteria_id) || count($karyawan_id) !== count($nilai)) {
    abort(400, "数据格式错误:员工、子准则、评分数量不匹配");
}

// 一一对应插入数据
foreach ($karyawan_id as $index => $_) {
    Penilaian::create([
        'date' => $date,
        'karyawan_id' => $karyawan_id[$index],
        'sub_kriteria_id' => $sub_kriteria_id[$index],
        'nilai' => $nilai[$index],
    ]);
}

额外注意事项

  • 确保Penilaian模型已将相关字段加入$fillable,否则无法通过create()批量赋值:
// app/Models/Penilaian.php
protected $fillable = ['date', 'karyawan_id', 'sub_kriteria_id', 'nilai'];
  • 建议用事务包裹插入操作,避免部分数据存入:
DB::beginTransaction();
try {
    foreach ($karyawan_id as $index => $_) {
        Penilaian::create([
            'date' => $date,
            'karyawan_id' => $karyawan_id[$index],
            'sub_kriteria_id' => $sub_kriteria_id[$index],
            'nilai' => $nilai[$index],
        ]);
    }
    DB::commit();
} catch (\Exception $e) {
    DB::rollBack();
    abort(500, "存储失败:" . $e->getMessage());
}

内容的提问来源于stack exchange,提问作者Luthfi Anshari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:32:16