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

如何在TypeORM查询中将用户角色转为仅含角色名的数组?

解决NestJS + TypeORM多对多关联返回角色名数组的问题

方法一:查询后映射转换

这是最直接的方案,先完整查询用户及其关联角色,再通过JavaScript映射将角色对象转换为名称数组:

// 先查询用户和关联的roles(修正原代码冗余嵌套,直接关联roles即可)
const users = await this.userRepository.find({
  relations: ['roles'],
});

// 转换roles为名称数组
const result = users.map(user => ({
  ...user,
  roles: user.roles.map(role => role.name)
}));

这种方式无需依赖SQL方言,代码易读易维护,适合大多数场景。

方法二:使用QueryBuilder结合MySQL聚合函数

如果希望直接在数据库层面完成聚合,可利用MySQL的JSON_ARRAYAGG函数生成角色名数组:

const users = await this.userRepository
  .createQueryBuilder('user')
  .leftJoin('user.roles', 'role') // 关联roles表
  .select([
    'user.id',
    'user.username', // 按需添加其他需要的用户字段
    'COALESCE(JSON_ARRAYAGG(role.name), JSON_ARRAY()) as roles' // 聚合角色名,无角色时返回空数组
  ])
  .groupBy('user.id') // 按用户ID分组,MySQL开启ONLY_FULL_GROUP_BY模式时,需将所有非聚合用户字段加入GROUP BY
  .getRawMany();

注意:getRawMany()返回原始数据对象而非Entity实例,若需要Entity实例可自行转换。

内容的提问来源于stack exchange,提问作者Dmitriy Novikov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:52:32