Laravel框架下如何在hasMany关联中正确使用updateOrCreate方法
问题根源
你对updateOrCreate的使用不符合你的业务需求:updateOrCreate方法的第一个参数是匹配查询条件,你原先的写法逻辑是「查找当前关联下serial等于当前循环值的记录,存在就更新,不存在就新建」,完全不满足你「按传入数组的顺序依次覆盖旧记录、超出长度的新增」的要求。
正确实现代码
你需要先取出当前关联下按id升序排列的已有记录,再按索引对应匹配传入的serial数组做更新/新增操作:
// 先获取当前关联下按id升序排列的所有已有记录 $existingSerials = $code->item->serials()->orderBy('id')->get(); $newSerials = $data['item_serials']; foreach ($newSerials as $index => $serial) { if (isset($existingSerials[$index])) { // 对应索引存在旧记录,直接更新serial字段 $existingSerials[$index]->update(['serial' => $serial]); } else { // 超出已有记录长度,新增记录 $code->item->serials()->create(['serial' => $serial]); } } // 可选:如果需要删除新数组长度之外的多余旧记录,可以加上这行 // $code->item->serials() // ->whereNotIn('id', $existingSerials->take(count($newSerials))->pluck('id')) // ->delete();
执行后即可得到你预期的结果:原有id为1、2的记录分别更新为test1、test2,新增id为3的记录值为test3。
内容的提问来源于stack exchange,提问作者zyyyzzz
相关产品推荐
相关产品推荐

