Laravel Eloquent多态关联查询:按类型筛选关联字段
解决Laravel多态关联预加载按类型指定字段的问题
嘿,这个需求其实Laravel的Eloquent已经提供了很优雅的解决方案啦!你可以利用morphWith方法,在预加载approvable关联的时候,针对不同的模型类型分别指定要获取的字段。
方法一:查询时动态指定(推荐,灵活性高)
直接在查询语句中通过闭包结合morphWith来定义不同模型的字段选择:
use App\Models\ChecklistCategory; use App\Models\Deviation; use App\Models\Approval; $approvals = Approval::with([ 'approvable' => function ($query) { $query->morphWith([ ChecklistCategory::class => function ($q) { $q->select('id', 'name', 'description'); }, Deviation::class => function ($q) { $q->select('id', 'name', 'seriousness'); } ]); } ])->get();
关键说明:
morphWith是Laravel为多态关联量身打造的方法,允许你为每个关联的模型类型定义独立的查询逻辑- 必须包含
id字段:Eloquent需要通过id与approvable_id关联匹配,缺少的话会导致关联模型无法正确加载 - 针对不同模型类型,你可以自由指定需要的字段,完全符合你的需求
方法二:模型全局配置(适合固定需求场景)
如果你的业务需求中,所有加载approvable关联的场景都需要固定字段,也可以在Approval模型的关联定义中全局设置:
// 在App\Models\Approval中 use App\Models\ChecklistCategory; use App\Models\Deviation; public function approvable() { return $this->morphTo()->morphWith([ ChecklistCategory::class => function ($q) { $q->select('id', 'name', 'description'); }, Deviation::class => function ($q) { $q->select('id', 'name', 'seriousness'); } ]); }
之后,每次执行Approval::with('approvable')->get()时,都会自动按照你设置的字段加载关联模型,无需重复编写查询逻辑。
内容的提问来源于stack exchange,提问作者Hammad Butt
相关产品推荐
相关产品推荐

