You need to enable JavaScript to run this app. TypeORM中使用QueryBuilder如何实现带嵌套子关联的leftJoinAndSelect查询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 23:54:02