NestJS结合TypeORM多对多关联时如何将角色参数存入关联PermissionRole表
实现方案
你只需要按以下步骤调整代码即可,利用TypeORM自带的多对多关联能力自动维护PermissionRole中间表,不需要手动写SQL操作中间表:
步骤1:调整依赖注入
首先在permission.service.ts的构造函数中注入Role的仓库,用于查询角色实例:
import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Role } from './Role.entity'; // 按你实际路径调整 // 在类的构造函数中添加注入 constructor( @InjectRepository(Permission) private readonly permissionRepository: Repository<Permission>, // 新增注入Role仓库 @InjectRepository(Role) private readonly roleRepository: Repository<Role>, ) {}
步骤2:修改创建权限的业务逻辑
在原有的createPermission方法中,保存完新权限后追加角色关联逻辑:
async createPermission(permission: CreatePermissionDto) { const exist = await this.permissionRepository.findOne({ where: { Name: permission.Name }, }); if (exist) throw new ConflictException( 'The permission already exists.', HttpStatus.CONFLICT.toString(), ); const newPermission = await this.permissionRepository.save(permission); // 新增:处理角色关联逻辑 if (permission.Role?.trim()) { // 拆分逗号分隔的角色ID,转为数字并过滤无效值 const roleIdList = permission.Role.split(',') .map(idStr => parseInt(idStr.trim(), 10)) .filter(id => !isNaN(id)); if (roleIdList.length) { // 批量查询存在的角色实例 const roles = await this.roleRepository.findByIds(roleIdList); // 可选校验:如果传入的角色ID有不存在的,抛出异常 // if (roles.length !== roleIdList.length) { // throw new BadRequestException('存在无效的角色ID'); // } // 给权限实体关联角色 newPermission.roles = roles; // 保存关联,TypeORM会自动往PermissionRole表插入对应记录 await this.permissionRepository.save(newPermission); } } return Object.assign( {}, { status: HttpStatus.CREATED, message: 'Permission has been saved successfully.', permission: newPermission, }, ); }
步骤3:确认Dto配置
确认你的CreatePermissionDto中已经定义了Role字段,示例:
import { IsString, IsOptional } from 'class-validator'; export class CreatePermissionDto { // 其他原有字段 @IsString() @IsOptional() Role?: string; }
原理说明
你已经在Role实体中通过@JoinTable指定了多对多关联的中间表为PermissionRole,TypeORM会自动管理这个中间表的数据,当你给权限实体的roles关联字段赋值并保存时,会自动生成中间表记录,完全匹配你需要的RoleId+PermissionId的存储格式。
内容的提问来源于stack exchange,提问作者laur
相关产品推荐
相关产品推荐

