Laravel实现分类列表展示:父分类ID替换为对应分类名称
分类表父ID转名称展示解决方案
以下方案均符合分类表专业设计规范,可根据业务场景选择:
方案1:SQL自关联查询(无需修改表结构,优先推荐)
该方案符合数据库第三范式要求,无冗余数据,不需要额外维护数据一致性,是邻接表型分类结构的标准实现方式。
假设你的分类表名为category,核心字段为id(主键)、category_name(分类名称)、parent_id(父分类ID,顶级分类对应值为0或NULL),查询语句示例:
SELECT c1.category_name AS '分类名称', IFNULL(c2.category_name, '无') AS '父分类' FROM category c1 LEFT JOIN category c2 ON c1.parent_id = c2.id;
查询结果直接匹配你需要的表格格式,输出到视图文件即可。
方案2:应用层映射转换(适合小数据量场景)
如果分类总数据量不大(通常少于1000条),可以在应用层做转换,不需要修改SQL逻辑:
- 第一步:全量查询所有分类的ID和名称,生成
{分类ID: 分类名称}的映射字典 - 第二步:遍历你当前查询到的分类列表,对每条数据的
parent_id字段,去映射字典中取值,匹配不到就返回无,赋值给前端要展示的父分类字段即可。
方案3:表结构加冗余字段优化(适合高查询量场景)
如果分类查询QPS很高,自关联查询性能满足不了要求,可以调整表结构新增parent_name冗余字段,符合大数据场景下的反范式优化规范:
- 表结构调整:给分类表加
parent_nameVARCHAR类型字段,存储父分类名称 - 数据一致性保障:
- 新增/修改分类时,根据选择的父分类ID同步写入对应父分类名称到该字段
- 父分类本身的名称修改时,同步更新所有子分类的
parent_name值,可通过应用层事务或者数据库触发器实现
- 查询时直接单表查询
category_name和parent_name字段即可,无需关联,查询性能最优。
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

