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

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

参考资料

  • 三者模型关系示意图:
    Patient、Registration、Polyclinic模型关联关系
  • 患者病史页效果图:
    患者病史页面

内容的提问来源于stack exchange,提问作者Willy Sudwihartono

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:39:04