Laravel 9中通过hasManyThrough获取关联的中间模型PingtreeEntry
解决方案
要同时获取中间模型PingtreeEntry和关联的Pingtree,你需要调整模型关联和查询逻辑,具体步骤如下:
1. 补充模型关联
首先在PingtreeGroup模型中添加直接关联PingtreeEntry的方法:
/** * 获取关联的中间模型 PingtreeEntry */ public function pingtreeEntries() { return $this->hasMany(PingtreeEntry::class, 'pingtree_group_id'); }
然后在PingtreeEntry模型中添加关联Pingtree的方法(如果还没定义):
/** * 获取关联的 Pingtree 模型 */ public function pingtree() { return $this->belongsTo(Pingtree::class, 'pingtree_id'); }
2. 修改查询代码
使用嵌套预加载(Nested Eager Loading)同时加载PingtreeEntry及其关联的Pingtree,这样就能在获取PingtreeGroup时,同时拿到中间表和目标模型的数据:
$pingtreeGroups = PingtreeGroup::where('company_id', $company_id) ->with('pingtreeEntries.pingtree') ->withCount('pingtreeEntries') // 若需统计中间表条目数量,可替换原有的pingtrees count ->paginate($request->input('perPage', 10));
说明
原来的hasManyThrough关联会直接跳过中间模型获取最终的Pingtree,不会携带PingtreeEntry的字段信息。通过嵌套预加载中间模型及其关联,你可以完整获取PingtreeGroup -> PingtreeEntry -> Pingtree的层级数据,同时保留中间表的所有字段。
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

