如何在NestJS中用TypeORM查询PostgreSQL并返回关联字段指定值
问题:NestJS查询User实体时,将关联的Role字段转为name值返回
我在NestJS应用里定义了带Role关联的User实体:
@Entity() class User { ... @ManyToOne(() => Role, { eager: true, }) role?: Role; }
@Entity() export class Role extends EntityHelper { @PrimaryColumn() id: number; @Column() name?: string; }
用这段代码查询用户:
this.usersRepository.find({ relations: { role: true, }, })
得到的结果是:
{ id: 1, name: "John", role: { id: 2, name: "user" }}
但我希望返回的role直接是name值,格式如下:
{ id: 1, name: "John", role: "user" }
请问怎么实现查询关联关系并只返回role的name值?
解决方案
方法1:使用TypeORM查询构建器直接映射字段
直接通过查询构建器将role的name字段别名设为role,从数据库层面返回目标结构,无需额外处理:
const users = await this.usersRepository .createQueryBuilder('user') .leftJoin('user.role', 'role') .select([ 'user.id', 'user.name', 'role.name AS role' ]) .getRawMany();
方法2:在User实体中添加自定义getter(结合class-transformer)
给User实体新增getter属性返回role的name,同时隐藏原始的role对象:
- 先安装依赖(如果没装):
npm install class-transformer
- 修改User实体:
import { Exclude, Expose } from 'class-transformer'; @Entity() class User { ... @Exclude() // 排除原始role对象,不参与序列化 @ManyToOne(() => Role, { eager: true, }) role?: Role; @Expose() // 将getter暴露为role字段 get role(): string | undefined { return this.role?.name; } }
- 查询时转换结果:
import { classToPlain } from 'class-transformer'; const users = await this.usersRepository.find({ relations: { role: true } }); const transformedUsers = users.map(user => classToPlain(user));
方法3:使用DTO手动转换数据
定义UserDTO类,手动映射实体字段到目标结构:
export class UserDTO { id: number; name: string; role: string; static fromEntity(user: User): UserDTO { return { id: user.id, name: user.name, role: user.role?.name || '', }; } }
查询后转换为DTO:
const users = await this.usersRepository.find({ relations: { role: true } }); const userDTOs = users.map(user => UserDTO.fromEntity(user));
内容的提问来源于stack exchange,提问作者Rich Voronov
相关产品推荐
相关产品推荐

