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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:18:02