Eloquent多态关联查询异常:单个资源调用with('privacy')->get()返回全量数据
解决单个模型加载关联数据的问题
你说得没错,get()在这里确实用错啦!原因很简单:$event已经是一个单个的Event模型实例了,当你调用$event->with('privacy')->get()时,实际上是重新发起了一个查询所有Event记录的请求,自然会返回全量数据集合。
针对已经存在的单个模型实例,你需要用延迟加载的方法来加载关联,正确的替代方案有两个:
1. 使用load()方法
这是最直接的方式,专门用于给已有的模型实例加载关联数据:
// 给$event加载privacy关联 $event->load('privacy'); // 之后直接访问关联即可 $privacySettings = $event->privacy;
2. 使用loadMissing()方法(更高效)
如果你不确定关联是否已经被加载,用这个方法可以避免重复查询数据库,它只会在关联未加载时才去查询:
$event->loadMissing('privacy');
另外补充一个场景:如果你还没获取单个Event实例,想在查询的时候就预加载关联数据,可以这样写:
// 直接查询单个Event并预加载privacy $event = Event::with('privacy')->find($eventId); // 或者用first() $event = Event::with('privacy')->where('id', $eventId)->first();
简单总结一下区别:
with():用于查询模型之前,实现预加载关联,减少N+1查询问题load()/loadMissing():用于模型实例已经存在之后,实现延迟加载关联
内容的提问来源于stack exchange,提问作者Frisbetarian-Support Palestine
相关产品推荐
相关产品推荐

