NestJS 中的 TypeORM - 如何在实体中获取 MySQL 嵌套对象并对子关系进行“位置”查询?

Posted

技术标签:

【中文标题】NestJS 中的 TypeORM - 如何在实体中获取 MySQL 嵌套对象并对子关系进行“位置”查询?【英文标题】:TypeORM in NestJS - how to get MySQL nested object like in the entity and do a 'where' query on subrelation? 【发布时间】:2021-10-31 01:56:51 【问题描述】:

我曾尝试以 QueryBuilder 的身份进行此操作:

const ret = await getManager()
  .createQueryBuilder(Order, 'o')
  .leftJoinAndSelect(PartOfOrder, 'p', 'o.id = p.orderId')
  .where(':purcharser = o.purchaserId',  purcharser: purcharserId )
  .andWhere(':supplier = p.supplierId',  supplier: supplier.id )
  .andWhere('p.status = 0')
  .getRawMany();

结果如下:


    "o_id": "3454d7fe-072a-4983-a811-5ce45106488c",
    "o_date": "2021-09-01T07:30:07.000Z",
    "o_amount": 20598,
    "o_paymentId": "b8c937f0-4d61-4f84-8760-ebb0ec5bc35f",
    "o_purchaserId": "5adeb8ed-6703-4e82-a7e3-2b10d8fbf912",
    "p_id": "8c6bfc56-aa7a-4d9a-a872-7ccd370a7137",
    "p_amount": 200,
    "p_delivery": 0,
    "p_message": "",
    "p_date": "2021-09-01T07:30:07.000Z",
    "p_status": 0,
    "p_pickupCode": 8073,
    "p_supplierId": "e41aff94-343c-4062-b55a-90bf1b3e3695",
    "p_orderId": "3454d7fe-072a-4983-a811-5ce45106488c"

这里我有平坦的响应,我需要从 SQL 中嵌套。

下面我有一个find() 查询,但我不知道将where 放在嵌套对象中的哪个位置。

const ret = await Order.find(
  relations: ['partsOfOrder', 'partsOfOrder.products'],
  where:  purchaser: purcharserId ,
);

编辑

我的订单实体关系道具:

@OneToMany(
  type => PartOfOrder,
  entity => entity.order,
  
    cascade: true,
    onDelete: 'CASCADE',
  ,
)
@JoinColumn()
partsOfOrder: IPartOfOrder[];

我可以在任何循环中过滤它,但服务器会死机,并且确实需要在 SQL 中执行此操作

【问题讨论】:

【参考方案1】:

在您的第一个解决方案中,尝试使用getMany() 而不是getRawMany(),您将获得一个嵌套对象。

【讨论】:

它只返回查询中的主实例,在这种情况下我只从订单实体中获取数据。 这很奇怪,可能你应该另外指定选择(在.leftJoinAndSelect之后添加.select('o', 'p') 我有一个很好的解决方案: const ret = await Order.createQueryBuilder('order') .innerJoinAndSelect('order.partsOfOrder', 'part') .innerJoinAndSelect('part.products', 'products ') .where(':purcharser = order.purchaserId', purcharser: purcharserId ) .andWhere(':supplier = part.supplierId', 供应商:supplier.id ) .andWhere('part.status = 0' ) .getMany(); PS 告诉我如何在注释中粘贴格式为格式的代码? 在 cmets 中,你可以只用 ` 括号把它包起来,但这将是一行代码的和平

以上是关于NestJS 中的 TypeORM - 如何在实体中获取 MySQL 嵌套对象并对子关系进行“位置”查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NestJS 配置注入 TypeORM 实体?

如何从控制器 JSON 返回的实体字段中排除。 NestJS + Typeorm

NestJS + TypeORM 中的 JoinTable 问题

使用 NestJS、TypeORM、GraphQL 更新具有实体之间关系的 PSQL 表

NestJS typeorm - 无法创建实体

NestJS & TypeORM:发布请求中的 DTO 格式