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
相关产品推荐
相关产品推荐

