You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

医疗门诊应用HTML表格:外键显示文本而非ID的实现方案

解决就诊表外键显示ID而非实际文本的方案

嘿,这个需求我在做社区诊所管理系统的时候刚好碰到过!核心就是要把外键关联的表数据和就诊表做关联查询,然后把对应的文本字段传递到前端渲染就行。下面分后端查询和前端渲染两个部分给你具体说:

一、后端:关联查询获取实际文本值

不管你用原生SQL还是ORM框架,核心都是把就诊表和关联的患者、医生、病症、药物表做连接,取出需要的文本字段。

1. 原生SQL(以MySQL为例)

假设你的表结构是:

  • visits:包含idpatient_iddoctor_idcondition_idmedication_id等字段
  • patientsidname(患者姓名)
  • doctorsidname(医生姓名)
  • conditionsidtitle(病症名称)
  • medicationsidname(药物名称)

那查询语句应该用LEFT JOIN(避免外键为空时丢失数据):

SELECT 
    v.id AS visit_id,
    p.name AS patient_name,
    d.name AS doctor_name,
    c.title AS condition_title,
    m.name AS medication_name,
    v.visit_date,
    v.notes
FROM visits v
LEFT JOIN patients p ON v.patient_id = p.id
LEFT JOIN doctors d ON v.doctor_id = d.id
LEFT JOIN conditions c ON v.condition_id = c.id
LEFT JOIN medications m ON v.medication_id = m.id;

这样查出来的结果里就直接包含了患者姓名、医生姓名这些文本值,而不是ID。

2. ORM框架(以Django为例)

如果用ORM,可以通过序列化器嵌套关联模型来获取文本值:

from rest_framework import serializers
from .models import Visit, Patient, Doctor, Condition, Medication

# 先定义关联表的序列化器,只取需要的文本字段
class PatientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Patient
        fields = ['name']

class DoctorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Doctor
        fields = ['name']

class ConditionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Condition
        fields = ['title']

class MedicationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Medication
        fields = ['name']

# 就诊表序列化器,嵌套关联的序列化器
class VisitSerializer(serializers.ModelSerializer):
    patient_name = PatientSerializer(source='patient')
    doctor_name = DoctorSerializer(source='doctor')
    condition_title = ConditionSerializer(source='condition')
    medication_name = MedicationSerializer(source='medication')

    class Meta:
        model = Visit
        fields = ['id', 'patient_name', 'doctor_name', 'condition_title', 'medication_name', 'visit_date', 'notes']

这样接口返回的JSON数据里就会包含对应的文本值了。

二、前端:渲染实际文本值

拿到后端返回的包含文本字段的数据后,直接在表格里渲染对应的字段就行,不用再处理ID。

1. 原生HTML+模板引擎(以EJS为例)

<table>
  <thead>
    <tr>
      <th>就诊ID</th>
      <th>患者姓名</th>
      <th>医生姓名</th>
      <th>病症</th>
      <th>开具药物</th>
      <th>就诊日期</th>
      <th>备注</th>
    </tr>
  </thead>
  <tbody>
    <% visits.forEach(visit => { %>
    <tr>
      <td><%= visit.visit_id %></td>
      <td><%= visit.patient_name || '无' %></td> <!-- 处理空值 -->
      <td><%= visit.doctor_name || '无' %></td>
      <td><%= visit.condition_title || '无' %></td>
      <td><%= visit.medication_name || '无' %></td>
      <td><%= visit.visit_date %></td>
      <td><%= visit.notes || '无' %></td>
    </tr>
    <% }) %>
  </tbody>
</table>

2. Vue.js示例

<table>
  <thead>
    <tr>
      <th>就诊ID</th>
      <th>患者姓名</th>
      <th>医生姓名</th>
      <th>病症</th>
      <th>开具药物</th>
      <th>就诊日期</th>
      <th>备注</th>
    </tr>
  </thead>
  <tbody>
    <tr v-for="visit in visits" :key="visit.visit_id">
      <td>{{ visit.visit_id }}</td>
      <td>{{ visit.patient_name || '无' }}</td>
      <td>{{ visit.doctor_name || '无' }}</td>
      <td>{{ visit.condition_title || '无' }}</td>
      <td>{{ visit.medication_name || '无' }}</td>
      <td>{{ visit.visit_date }}</td>
      <td>{{ visit.notes || '无' }}</td>
    </tr>
  </tbody>
</table>

小提示

  • 如果外键字段允许为空,一定要用LEFT JOIN(SQL)或者确保ORM返回空值时前端能正确处理,不然会丢失部分就诊记录。
  • 要是你用的是其他后端框架(比如Spring Boot)或者前端框架(React),思路也是一样的:后端关联查询取文本,前端渲染对应字段。

内容的提问来源于stack exchange,提问作者Andy Terry

火山引擎 最新活动