Laravel 10中如何关联未持久化模型并批量保存?
解决方案
在Laravel 10中,你需要将创建的关联模型实例添加到主模型的关联集合中,让主模型感知到关联模型的存在,之后通过push()方法即可一次性持久化主模型和所有关联模型。
修正后的代码
$detail = OrderDetail::make([ 'example' => 'example', ]); // 创建关联模型并添加到主模型的关联集合 $imprint = $detail->imprints()->make(['imprintID' => 1]); $detail->imprints->add($imprint); // 或者更简洁的写法: // $detail->imprints->push(OrderDetailImprint::make(['imprintID' => 1])); // ... 执行其他业务代码 $detail->push(); // 同时保存主模型OrderDetail和关联的OrderDetailImprint
关键说明
- 原代码问题:你之前用
$detail->imprints()->make()仅创建了关联模型实例,但没有将其加入主模型的imprints内存集合,导致主模型无法感知到该关联实例的存在,调用save()时只会持久化主模型本身。 push()的作用:Laravel的push()方法会递归保存当前模型及其所有已加载的关联模型——只要关联模型未被持久化(无主键ID),就会执行创建操作;若已持久化则执行更新操作。- 替代方案(若需用
save()):如果一定要用save()方法,可在主模型保存后手动批量保存关联模型,但这会触发两次数据库操作:
$detail->save(); $detail->imprints()->saveMany($detail->imprints);
内容的提问来源于stack exchange,提问作者Rager
相关产品推荐
相关产品推荐

