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
相关产品推荐
相关产品推荐

