如何在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
相关产品推荐
相关产品推荐

