Laravel中如何用DB::transaction更新同part_id的关联记录?
批量更新关联同一part_id的PartsInfo记录方案
针对你的需求,分两种常见场景给出实现方式:
场景1:替换该part_id下的所有记录(删除旧数据,新增新数据)
如果你的需求是直接用前端提交的最新数据覆盖该part_id下的所有PartsInfo记录,这种方式最简单,适合不需要保留旧记录的场景:
DB::transaction(function () use ($request) { // 先删除当前part_id下的所有旧记录 PartsInfo::where('part_id', $request->id)->delete(); // 批量新增新的记录(和你原来的创建逻辑一致) for ($parts=0; $parts < count($request->name) ; $parts++) { $parts_info = new PartsInfo; $parts_info->part_id = $request->id; $parts_info->name = $request->name[$parts]; $parts_info->qty = $request->qty[$parts]; $parts_info->price = $request->price[$parts]; $parts_info->save(); } });
用事务包裹操作,确保删除和新增要么全部成功,要么全部回滚,避免数据不一致。
场景2:精准更新每条已有记录
如果需要保留原有记录,只更新对应字段,必须让前端传递每条PartsInfo记录的id(比如请求参数里包含ids数组,和name/qty/price数组一一对应),实现代码如下:
DB::transaction(function () use ($request) { // 先校验提交的字段数量是否匹配,避免数据错位 $fieldCounts = [ count($request->ids), count($request->name), count($request->qty), count($request->price) ]; if (count(array_unique($fieldCounts)) !== 1) { throw new \Exception('提交的各字段数量不匹配'); } for ($parts=0; $parts < count($request->ids) ; $parts++) { // 找到对应id且属于当前part_id的记录(加part_id校验防止越权修改) $parts_info = PartsInfo::where('id', $request->ids[$parts]) ->where('part_id', $request->id) ->firstOrFail(); // 找不到记录时抛出异常 // 更新字段 $parts_info->name = $request->name[$parts]; $parts_info->qty = $request->qty[$parts]; $parts_info->price = $request->price[$parts]; $parts_info->save(); } });
你之前尝试的问题说明
你用PartsInfo::where('parts_id', $request->id)->get()得到的是该part_id下的所有记录集合,但如果没有每条记录的唯一标识(id)来对应前端传来的更新数据,无法确定把哪个name/qty赋值给集合里的哪条记录,所以要么用全删全加的方式,要么必须传递每条记录的id来精准匹配更新。
内容的提问来源于stack exchange,提问作者devquery
相关产品推荐
相关产品推荐

