Files
zyt/APPOINTMENT_TABLE_PREFIX_FIX.md
T
2026-03-04 15:32:30 +08:00

2.5 KiB

挂号管理联表查询修复

问题描述

挂号列表页面中,患者姓名和医生姓名没有显示,后端接口返回数据不全。

问题原因

AppointmentLists.phpAppointmentLogic.php 中,联表查询时使用的表名缺少表前缀 la_

ThinkPHP 在使用 leftJoin() 时,需要指定完整的表名(包括表前缀),而不能只写表名。

错误代码

// 错误:缺少表前缀
->leftJoin('user u', 'a.patient_id = u.id')
->leftJoin('admin ad', 'a.doctor_id = ad.id')

正确代码

// 正确:包含表前缀 la_
->leftJoin('la_user u', 'a.patient_id = u.id')
->leftJoin('la_admin ad', 'a.doctor_id = ad.id')

修复的文件

1. server/app/adminapi/lists/doctor/AppointmentLists.php

修复了两处:

  • lists() 方法中的联表查询
  • count() 方法中的联表查询

2. server/app/adminapi/logic/doctor/AppointmentLogic.php

修复了一处:

  • detail() 方法中的联表查询

数据库表说明

系统使用的表:

  • la_doctor_appointment - 挂号表(主表)
  • la_user - 用户表(患者信息)
  • la_admin - 管理员表(医生信息)

字段映射:

  • u.nicknamepatient_name (患者姓名)
  • u.mobilepatient_phone (患者电话)
  • ad.namedoctor_name (医生姓名)

验证方法

修复后,访问挂号列表接口应该返回完整的数据:

{
  "code": 1,
  "msg": "success",
  "data": {
    "lists": [
      {
        "id": 1,
        "patient_id": 2,
        "patient_name": "张三",        // ✅ 现在有值了
        "patient_phone": "13800138000", // ✅ 现在有值了
        "doctor_id": 1,
        "doctor_name": "李医生",        // ✅ 现在有值了
        "appointment_date": "2026-03-05",
        "appointment_time": "09:00:00",
        "status": 1,
        "status_desc": "已预约",
        ...
      }
    ]
  }
}

注意事项

在 ThinkPHP 中使用联表查询时:

  1. 使用模型的 leftJoin():必须指定完整表名(包括表前缀)

    ->leftJoin('la_user u', 'a.patient_id = u.id')
    
  2. 使用 Db::table():可以不加表前缀(框架会自动添加)

    Db::table('user')->alias('u')->...
    
  3. 表前缀配置:在 config/database.php 中配置

    'prefix' => 'la_',
    

相关文档

  • APPOINTMENT_MANAGEMENT_COMPLETE.md - 挂号管理完整文档
  • APPOINTMENT_SETUP_GUIDE.md - 配置指南