NestJS项目中TypeORM的OneToMany关联字段未在数据库生成如何解决
问题原因说明
你观察到的现象是TypeORM的正常表现,完全符合关系型数据库的一对多关联设计逻辑:
- 一对多关联的外键永远存储在「多」的那一侧表中,你现在Like表中生成的
movieId字段,已经完整承载了两张表的关联关系,不需要在「一」侧的Movie表额外存储字段 - Movie实体里的
likes: Like[]是ORM层面的映射属性,不是数据库表的物理字段,TypeORM不会为这个属性在Movie表生成对应的列,它的作用是让你在查询Movie时可以通过关联加载直接拿到对应的所有Like记录
关联数据查询示例
如果需要获取某部电影对应的所有点赞数据,只需要在查询时指定关联加载即可,参考写法:
// find方法指定关联 const movies = await movieRepository.find({ relations: ['likes'] }); // QueryBuilder关联查询 const movies = await movieRepository .createQueryBuilder('movie') .leftJoinAndSelect('movie.likes', 'like') .getMany();
查询完成后直接通过movies[0].likes即可拿到对应电影的所有点赞记录,无需Movie表存在物理存储的likes字段。
冗余存储点赞总数方案(可选)
如果你希望在Movie表直接存储点赞总数,避免每次查询都要关联统计,可以单独添加业务冗余字段,配合业务逻辑或数据库触发器更新即可,示例配置:
// 在Movie实体中新增字段 @Column({ default: 0 }) likeCount: number;
该字段为业务自定义字段,不属于OneToMany关联自动生成的范畴。
内容的提问来源于stack exchange,提问作者octavemirbeau
相关产品推荐
相关产品推荐

