You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:59:57