Laravel Eloquent深层关联:如何通过Patient模型直接获取Polyclinic数据
问题解答
可行性结论
完全可以通过Eloquent的关联特性直接跨模型获取数据,Laravel原生支持嵌套关联访问,也可以定义穿透关联直接从Patient模型获取Polyclinic数据。
实现步骤
1. 确认基础关联定义
首先确保三个模型的关联配置正确:
- Patient模型定义一对多关联Registration
// app/Models/Patient.php public function registrations() { return $this->hasMany(Registration::class); }
- Registration模型定义一对一关联Polyclinic(因Registration表存储polyclinic_id外键,用belongsTo更符合逻辑)
// app/Models/Registration.php public function polyclinic() { return $this->belongsTo(Polyclinic::class); }
2. 两种跨关联查询方案
方案1:嵌套关联访问(最常用,适合需要同时展示就诊+门诊信息的场景)
查询时使用预加载加载嵌套关联,避免N+1性能问题:
// 控制器查询患者数据 $patient = Patient::with('registrations.polyclinic')->find($patientId);
视图层渲染时直接链式访问即可获取门诊名称:
@foreach($patient->registrations as $registration) <!-- 其他就诊记录字段 --> <!-- 把原来输出polyclinic_id的代码替换为下行即可显示门诊名称 --> <span class="高亮类名">{{ $registration->polyclinic->name }}</span> @endforeach
空值兼容处理:若存在polyclinic_id无效的情况,可使用
{{ $registration->polyclinic?->name }}(PHP8+)或{{ optional($registration->polyclinic)->name }}避免报错。
方案2:定义穿透关联(适合需要直接获取患者关联的所有门诊的场景)
在Patient模型中定义hasManyThrough穿透关联,直接跳过Registration获取Polyclinic数据:
// app/Models/Patient.php 新增关联 public function polyclinics() { return $this->hasManyThrough( Polyclinic::class, Registration::class, 'patient_id', // Registration表关联Patient的外键 'id', // Polyclinic表主键 'id', // Patient表主键 'polyclinic_id' // Registration表关联Polyclinic的外键 ); }
查询时直接加载穿透关联即可:
$patient = Patient::with('polyclinics')->find($patientId); // 直接获取所有关联的门诊集合:$patient->polyclinics
参考资料
- 三者模型关系示意图:

- 患者病史页效果图:

内容的提问来源于stack exchange,提问作者Willy Sudwihartono
相关产品推荐
相关产品推荐

