如何结合belongsToMany关系使用hasManyThrough获取Producer的Whiskies?
解决Producer通过hasManyThrough关联Whisky的问题
你的场景里,Producer和Distillery是一对一,Distillery和Whisky是多对多,原生的hasManyThrough只支持「一对多→一对多」的层级关联,没法直接套用,得结合中间表来调整。下面给两种可行的实现方式:
方案一:用中间表模型构建hasManyThrough关联
假设Distillery和Whisky的中间表叫distillery_whisky,先给这个表建一个Eloquent模型(比如DistilleryWhisky),然后在Producer模型里定义关联:
// app/Models/Producer.php public function whiskies() { return $this->hasManyThrough( Whisky::class, DistilleryWhisky::class, 'distillery_id', // distillery_whisky表中关联Distillery的外键 'id', // Whisky表的主键 'id', // Producer表的主键 'whisky_id' // distillery_whisky表中关联Whisky的外键 )->join('distilleries', 'distilleries.id', '=', 'distillery_whisky.distillery_id') ->where('distilleries.producer_id', $this->id) ->select('whiskies.*') ->distinct(); }
- 用
join关联distilleries表,过滤出当前生产商下属的酒厂数据 distinct()用来避免多对多关联产生的重复威士忌记录
方案二:直接通过关联嵌套查询(更简洁)
如果不需要完整的Eloquent关联对象(只是获取数据集合),可以直接利用已有的关联嵌套查询:
// app/Models/Producer.php public function whiskies() { return $this->distillery->whiskies; }
这里$this->distillery是Producer和Distillery的一对一关联,直接调用其whiskies多对多关联就能拿到所有下属酒厂的威士忌。
内容的提问来源于stack exchange,提问作者panthro
相关产品推荐
相关产品推荐

