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

如何在Laravel中定义HasManyThrough关联的反向关系(Teacher→Branch)

实现Teacher模型到Branch模型的反向关联

现有模型/表结构

branch:
    id - integer

department:
    id - integer

teacher:
    id  - integer
    branch_department_id - integer

branch_department:
    id - integer
    branch_id - integer
    department_id - integer

已实现的正向关联

已在Branch模型中通过HasManyThrough实现了到Teacher的关联:

public function teachers()
{
    return $this->hasManyThrough(
        Teacher::class,
        BranchDepartment::class,
        secondKey: 'branch_department_id',
    );
}

反向关联的实现方法

要让Teacher模型获取所属的Branch,需使用hasOneThrough关联——因为每个Teacher对应唯一的BranchDepartment,而每个BranchDepartment对应唯一的Branch。

在Teacher模型中添加如下方法:

public function branch()
{
    return $this->hasOneThrough(
        Branch::class,
        BranchDepartment::class,
        'id',               // 中间表BranchDepartment关联当前模型的字段(对应Teacher的branch_department_id)
        'id',               // 目标模型Branch的主键字段
        'branch_department_id', // 当前模型Teacher关联中间表的外键字段
        'branch_id'         // 中间表BranchDepartment关联目标模型Branch的外键字段
    );
}

参数说明

  • 第一个参数:目标模型Branch::class
  • 第二个参数:中间表模型BranchDepartment::class
  • 第三个参数:中间表中与当前模型外键匹配的字段(即BranchDepartment的id,对应Teacher的branch_department_id)
  • 第四个参数:目标模型的主键字段(Branch的id)
  • 第五个参数:当前模型中关联中间表的外键字段(Teacher的branch_department_id)
  • 第六个参数:中间表中关联目标模型的外键字段(BranchDepartment的branch_id)

定义完成后,即可通过$teacher->branch直接获取该教师所属的Branch实例。

内容的提问来源于stack exchange,提问作者MOHAMMAD RASIM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:35:01