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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:15:02