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

Laravel 5.4中正确使用hasManyThrough获取跨表关联数据

解决多表关联获取关联Program名称的问题

嘿,我来帮你搞定这个关联查询的需求!你已经理清了三张表的关联逻辑——admissions是admissions_categories和programs的中间表,接下来咱们分两种方式实现你要的效果:

方法一:嵌套关联加载

既然你已经在AdmissionsCategory模型里定义了和Admissions的hasMany关系,那咱们只需要在Admissions模型里补充和Program的关联,然后嵌套加载即可。

1. 完善模型关联

  • AdmissionsCategory模型(你已有的关系):
public function admissions()
{
    return $this->hasMany(Admissions::class);
}
  • Admissions模型:补充和Program的关联
public function program()
{
    return $this->belongsTo(Program::class);
}

2. 查询并获取Program名称

查询时通过with()方法嵌套加载关联,就能拿到每个分类下所有关联的Program名称了:

$categories = AdmissionsCategory::with('admissions.program')->get();

// 遍历输出示例
foreach ($categories as $category) {
    echo "分类名称:{$category->name}\n";
    echo "关联的Program:\n";
    foreach ($category->admissions as $admission) {
        // 这里就能拿到对应的Program名称
        echo "- {$admission->program->name}\n";
    }
}

方法二:使用hasManyThrough直接关联

其实admissions_categories和programs是典型的“多对多通过中间表关联”场景,完全可以用hasManyThrough直接在AdmissionsCategory模型里定义和Program的关联,这样查询会更简洁。

1. 在AdmissionsCategory模型定义关联

public function programs()
{
    return $this->hasManyThrough(
        Program::class,       // 最终要关联的模型
        Admissions::class,     // 中间表模型
        'admissions_category_id', // 中间表关联当前模型的外键
        'id',                  // 最终模型关联中间表的外键(Program的主键)
        'id',                  // 当前模型的主键
        'program_id'           // 中间表关联最终模型的外键
    );
}

2. 直接查询关联的Programs

这样查询时就可以直接加载programs关联,不用嵌套了:

$categories = AdmissionsCategory::with('programs')->get();

// 遍历输出示例
foreach ($categories as $category) {
    echo "分类名称:{$category->name}\n";
    echo "关联的Program:\n";
    foreach ($category->programs as $program) {
        echo "- {$program->name}\n";
    }
}

两种方法都能实现你的需求,如果你需要保留中间表admissions的其他字段,用第一种嵌套关联更合适;如果只需要programs的信息,第二种hasManyThrough会更简洁。

内容的提问来源于stack exchange,提问作者M Shahzad Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:28:16