医疗门诊应用HTML表格:外键显示文本而非ID的实现方案
解决就诊表外键显示ID而非实际文本的方案
嘿,这个需求我在做社区诊所管理系统的时候刚好碰到过!核心就是要把外键关联的表数据和就诊表做关联查询,然后把对应的文本字段传递到前端渲染就行。下面分后端查询和前端渲染两个部分给你具体说:
一、后端:关联查询获取实际文本值
不管你用原生SQL还是ORM框架,核心都是把就诊表和关联的患者、医生、病症、药物表做连接,取出需要的文本字段。
1. 原生SQL(以MySQL为例)
假设你的表结构是:
visits:包含id、patient_id、doctor_id、condition_id、medication_id等字段patients:id、name(患者姓名)doctors:id、name(医生姓名)conditions:id、title(病症名称)medications:id、name(药物名称)
那查询语句应该用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




