首页 > 解决方案 > 如何从关系中仅获取列名

问题描述

如何加入列,当我启动我的函数时,他只返回列名而不是entity_columnName.

我正在使用 TypeORM,我试试这个;

const data = this.conn.getRepository(User).createQueryBuilder('user');
data.leftJoinAndSelect('user.orders', 'orders');
data.getRawMany();

但还给我:

firstName: ...
lastName: ...
age: ...
order_name: ...
order_price: ...

代替:

firstName: ...
lastName: ...
age: ...
name: ...
price: ...

有人可以告诉我怎么做吗?谢谢你的帮助

标签: javascripttypescriptnestjs

解决方案


您的用户和订单实体是如何定义的?

如果您使用该选项定义关系(例如 OneToMany)eager: true,则 TypeORM 将在您使用存储库*find方法查询时自动包含相关实体。当您使用 QueryBuilder 时,它不会这样做,您必须在其中添加它们,例如 with leftJoinAndSelect()(正如您所做的那样)。

来自具有 OneToMany 行项目的 Invoice 实体的示例:

  @OneToMany(
    () => InvoiceLineItem,
    (item: InvoiceLineItem) => item.invoice,
    { eager: true }
  )
  items: InvoiceLineItem[]

根据示例,如果我当时要find()findMany()发票,那么相关对象items也将包括在内,因为eager: true.

这种行为可能会很好地转化为您的用户和订单情况。

还要注意使用查询生成器之间getMany()和使用时的区别。getRawMany()

如果你使用getMany()TypeORM 会自动返回实体(例如你会得到一个User带有属性的实例,orders它是一个Order实例数组)。属性名称将是正确的。

由于您在问题中添加了 NestJS 标记,因此还要了解序列化: https ://docs.nestjs.com/techniques/serialization

ClassSerializerInterceptorNestJS 附带了一个您可能会觉得有用的内置程序。

在您的控制器中,您可以装饰类或其任何方法,例如

@UseInterceptors(ClassSerializerInterceptor)

这会将响应转换为 JSON,并将class-transformer在实体/DTO 类上应用装饰器指定的规则。

如果您要使用此拦截器,则发送给客户端的响应将具有您想要的属性名称。

如果您真的想修改客户端返回的响应,您还可以考虑编写自己的拦截器。


推荐阅读