You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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对象:

  1. 先安装依赖(如果没装):
npm install class-transformer
  1. 修改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;
  }
}
  1. 查询时转换结果:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:30:48