NestJS使用TypeORM保存电影与演员一对多关联数据问题
解决步骤
1. 修正实体关联配置
你当前的Actor实体关联定义存在错误,@ManyToOne 关联的应该是Movie实体对象,而非直接声明movieId字段,TypeORM会自动生成外键字段。同时需要给Movie实体的一对多关联开启级联保存,无需单独操作Actor表。
修正后的actor.entity.ts
//imports @Entity() export class Actor { @PrimaryGeneratedColumn() id: number; @ManyToOne(() => Movie, (movie) => movie.actors) movie: Movie; @Column() role: string; @Column() actor: string; }
修正后的movie.entity.ts
//imports @Entity() export class Movie { @PrimaryGeneratedColumn() id: number; //more stuff @OneToMany(() => Actor, (actor) => actor.movie, { cascade: true // 开启级联保存、更新,保存电影时自动同步保存关联演员数据 }) actors: Actor[]; }
2. 修改Repository保存逻辑
解析后的演员数组直接赋值给Movie实例的actors属性,调用save方法即可完成电影和关联演员的同步保存。
修改后的MoviesRepository代码
//imports @EntityRepository(Movie) export class MoviesRepository extends Repository<Movie> { // 如果你使用非级联方案,需要先注入ActorRepository // @InjectRepository(Actor) // private actorRepository: Repository<Actor>; async createMovie( createMovieDto: CreateMovieDto, fileName: string, filePath: string, ) { // 拆分基础电影数据和演员字符串 const { actorsArray, ...movieBaseInfo } = createMovieDto; // 创建电影实体,补充传入的文件相关字段 const movie = this.create({ ...movieBaseInfo, fileName, filePath }); // 解析演员JSON字符串为数组 const actors = JSON.parse(createMovieDto.actorsArray); // 关联演员数据到电影实例 movie.actors = actors; try { // 保存电影,级联开启状态下会自动将演员数据存入actor表并绑定外键 await this.save(movie); // --- 如果你不想使用级联配置,可以用以下方式手动保存演员 // // 先保存电影获取生成的电影id // await this.save(movie); // // 给每个演员绑定关联的电影id // const actorsWithMovieId = actors.map(item => ({ // ...item, // movieId: movie.id // })); // // 批量保存演员数据 // await this.actorRepository.save(actorsWithMovieId); // --- 非级联方案代码结束 return movie; } catch (error) { // 原代码这里是赋值操作=,修改为全等判断=== if (error.code === 'ER_DUP_ENTRY') { console.log(error); throw new ConflictException('Movie already exists'); } else { console.log(error); throw new InternalServerErrorException(); } } } }
内容的提问来源于stack exchange,提问作者Exo
相关产品推荐
相关产品推荐

