You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS中使用TypeORM如何获取MySQL嵌套对象并对子关联做where查询

方案1:调整QueryBuilder获取嵌套结构结果

你之前得到扁平结果是因为调用了getRawMany(),将其替换为getMany(),TypeORM会自动按照实体关联配置拼装为嵌套结构,调整后代码如下:

const ret = await getManager()
  .createQueryBuilder(Order, 'o')
  // 直接引用实体定义的关联属性,无需手动写关联匹配条件
  .leftJoinAndSelect('o.partsOfOrder', 'p')
  // 按需加载子关联的products
  .leftJoinAndSelect('p.products', 'prod')
  .where('o.purchaserId = :purchaser', { purchaser: purcharserId })
  .andWhere('p.supplierId = :supplier', { supplier: supplier.id })
  .andWhere('p.status = 0')
  // 替换getRawMany()为getMany()
  .getMany();

如果需要仅返回存在符合筛选条件子关联的父订单,可以把leftJoinAndSelect替换为innerJoinAndSelect,自动过滤无匹配子关联的父级记录,减少无效数据返回。

方案2:find方法实现子关联条件筛选

TypeORM 0.2.x及以上版本的find方法原生支持嵌套子关联的条件查询,写法如下:

const ret = await Order.find({
  relations: {
    partsOfOrder: {
      products: true
    }
  },
  where: {
    purchaser: purcharserId,
    // 直接嵌套子关联的筛选条件,会在SQL层面生成关联条件过滤
    partsOfOrder: {
      supplierId: supplier.id,
      status: 0
    }
  }
});

两种方案都可以直接在SQL层完成所有筛选逻辑,不需要业务层二次遍历过滤,不会产生额外性能损耗。

内容的提问来源于stack exchange,提问作者Dawid Pniewski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:18:01