TypeORM中使用QueryBuilder如何实现带嵌套子关联的leftJoinAndSelect查询
问题解决方法
核心原因
TypeORM 的 QueryBuilder 不会像 findOne 方法那样自动解析路径式的关联配置,你必须逐层手动声明每一级需要的嵌套关联的左连接查询,仅声明第一层 site.systems 的关联,QueryBuilder 不会自动向下加载二级、三级的关联数据。
完整修正代码
按照你的表关联关系,只需要在现有查询链路上,依次补全两层嵌套关联的 leftJoinAndSelect 配置即可,关联路径必须和实体类中定义的关系字段完全匹配:
export const getLocalSiteByIdWithSystems = async (id) => getManager() .createQueryBuilder(Site, 'site') // 保留原有逻辑:关联站点下状态为active的系统列表 .leftJoinAndSelect('site.systems', 'systems', 'systems.status = :status', { status: 'active', }) // 新增:关联每个系统所属的类型(SYSTEMS -> TYPE 多对一关系) .leftJoinAndSelect('systems.type', 'type') // 新增:关联每个类型所属的分类(TYPE -> CATEGORY 多对一关系) .leftJoinAndSelect('type.category', 'category') .where('site.id = :id', { id }) // 保留原有排序规则 .orderBy('systems.created_at', 'DESC') .getOne();
关键配置说明
- 关联路径不能跳层:必须严格按照从父到子的顺序依次声明连接,即先完成
site -> systems的连接,再声明systems -> type的连接,最后声明type -> category的连接,不能直接跨层写全路径的连接配置 - 全局参数可复用:之前声明的
id、status绑定参数会自动在整个查询链路生效,不需要在后续连接中重复声明 - 因为从
SYSTEMS向下的关联都是多对一关系,这类左连接不会导致主表(Site)的数据行数膨胀,最终返回的嵌套结构和你之前用findOne拿到的完整结构完全一致 - 如果后续需要对嵌套层数据做自定义排序,可以直接在
orderBy中使用对应关联的别名,比如对类型按名称升序排列就追加.orderBy('type.name', 'ASC')
内容的提问来源于stack exchange,提问作者Cristopher Dávila
相关产品推荐
相关产品推荐

