javascript - 如何从关系中仅获取列名
问题描述
如何加入列,当我启动我的函数时,他只返回列名而不是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: ...
有人可以告诉我怎么做吗?谢谢你的帮助
解决方案
您的用户和订单实体是如何定义的?
如果您使用该选项定义关系(例如 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
ClassSerializerInterceptor
NestJS 附带了一个您可能会觉得有用的内置程序。
在您的控制器中,您可以装饰类或其任何方法,例如
@UseInterceptors(ClassSerializerInterceptor)
这会将响应转换为 JSON,并将class-transformer
在实体/DTO 类上应用装饰器指定的规则。
如果您要使用此拦截器,则发送给客户端的响应将具有您想要的属性名称。
如果您真的想修改客户端返回的响应,您还可以考虑编写自己的拦截器。
推荐阅读
- ansible - 使用数组列表安装 yum 包作为 Ansible 中的版本号
- javascript - 如何过滤包含特定值的唯一对象的数组?
- python - 函数参数?
- ms-access - 您可以为 MS Access 查询创建加权选项吗?
- r - RColorBrewer::brewer.pal(n, pal) 中的错误:NA 不是 brewer.pal 的有效调色板名称
- python - 未找到“移动”的反向。'mobile' 不是有效的视图函数或模式名称
- tensorflow - Tensorflow Keras 的 Glorot Normal Initializer 的均值不为零
- c# - 添加与 buildindex 统一和随机级别无关的级别计数器
- javascript - 显示数组列表,数组长度为 0 并且元素在反应中未定义
- amazon-web-services - AWS SES SendBulkTemplatedEmailResponse 用于跟踪电子邮件状态