Laravel多态子关联预加载:如何仅加载存在的关联避免异常?
解决Laravel多态关联预加载时仅加载存在关联的问题
方案一:预加载时针对不同模态模型指定关联
直接在with的闭包中,为每个模态模型类单独定义需要预加载的关联,Laravel的morphTo查询原生支持这种写法:
Mission::with([ 'modality' => function ($morphQuery) { $morphQuery->with([ // 为AnnualStatementModality加载company和fiscal_year关联 AnnualStatementModality::class => ['company', 'fiscal_year'], // 为NewCompanyModality仅加载company关联 NewCompanyModality::class => ['company'], ]); } ])->get();
这种方式会根据Mission关联的模态类型,自动为对应模型加载存在的关联,既不会因某模型无对应关联抛出异常,也能彻底解决N+1查询问题。
方案二:在多态关联定义中全局设置预加载
如果需要每次加载modality关联时都自动预加载对应子关联,可以在Mission模型的modality关联方法中配置with属性:
// Mission模型文件 public function modality() { return $this->morphTo()->with([ AnnualStatementModality::class => ['company', 'fiscal_year'], NewCompanyModality::class => ['company'], ]); }
之后只需调用Mission::with('modality')->get(),就会自动按模型类型预加载对应的关联,代码更简洁易维护。
补充说明
- 两种方案均基于Laravel多态关联的原生特性,仅为存在对应关联的模型类加载关联,避免跨模型关联不存在的异常。
- 若后续新增其他模态模型,只需在对应配置中添加该模型的预加载关联列表即可,扩展性良好。
内容的提问来源于stack exchange,提问作者Vincent Mimoun-Prat
相关产品推荐
相关产品推荐

