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

如何在Laravel中实现主从表单更新及新增明细行功能

问题解答

updateOrCreate完全适配你当前编辑时新增明细行的场景。

原有代码的问题

你当前的明细更新逻辑仅支持修改已存在的明细记录:新增的前端表单行没有对应数据库生成的主键ID,调用AnodizingDetail::find($value['id'])会返回null,后续赋值保存时会抛出错误。

具体改造方法

updateOrCreate方法接收两个参数:第一个是匹配查询条件,第二个是需要写入/更新的字段值。匹配到记录就执行更新,没匹配到就新创建一条记录。
你可以将原有foreach循环部分的代码修改为如下内容:

foreach ($request->addmore as $key => $value) {
    AnodizingDetail::updateOrCreate(
        // 查询条件:传了ID就按ID匹配,同时绑定主记录ID避免篡改其他主记录的明细
        ['id' => $value['id'] ?? null, 'anodizing_id' => $id],
        // 要写入的字段值
        [
            'aluminium_id' => $value['name'],
            'qty' => $value['qty'],
            'weight' => $value['weight']
        ]
    );
}

注意事项

  • 请先确认AnodizingDetail模型的$fillable属性中已经添加了anodizing_id、aluminium_id、qty、weight字段,避免Laravel批量赋值拦截报错。
  • 前端新增的明细行不要设置默认ID,保持ID字段为空即可触发创建逻辑。
  • 如果你需要同步支持前端删除明细行的需求,可以在循环前添加如下代码,自动删除前端已经删掉的明细记录:
// 提取所有提交的已有明细ID,过滤掉空值(新增行的ID)
$existDetailIds = collect($request->addmore)->pluck('id')->filter();
// 删除当前主记录下、不在提交ID列表里的明细
AnodizingDetail::where('anodizing_id', $id)->whereNotIn('id', $existDetailIds)->delete();

内容的提问来源于stack exchange,提问作者Mulyono T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:54:04