如何在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
相关产品推荐
相关产品推荐

