如何在TypeORM中实现Recipe到Tag的单向一对多关联?
实现Recipe到Tag的单向一对多关联(TypeORM)
要把原来用simple-array存Tag ID的方式改成TypeORM的单向一对多关联,按以下步骤修改:
1. 更新Recipe实体
先删掉原来的tags字段(即simple-array类型的列),然后用TypeORM的关联装饰器替代:
@Entity() export class Recipe extends BaseEntity { @PrimaryGeneratedColumn('uuid') public id!: string; @Column({ type: 'varchar' }) public title!: string; @Column({ type: 'varchar' }) public description!: string; // 替换原tags字段,实现单向一对多关联 @OneToMany(() => Tag, { nullable: true, cascade: ['insert', 'update'] }) @JoinColumn({ name: 'recipe_id' }) // 在Tag表生成外键列,关联Recipe的id public tags: Tag[]; }
2. Tag实体无需修改
因为是单向关联,只需要Recipe知道关联的Tag,Tag不需要感知和Recipe的关系,所以原Tag代码保持不变:
@Entity() export class Tag extends BaseEntity { @PrimaryGeneratedColumn('uuid') public id!: string; @Column({ type: 'varchar' }) public name!: string; }
3. 关键配置说明
@OneToMany的选项:nullable: true:允许Recipe不关联任何Tagcascade: ['insert', 'update']:保存/更新Recipe时,自动同步关联的Tag(比如新增Recipe时一起存Tag,这个可选,看业务需求调整)
@JoinColumn:指定Tag表中外键列的名称为recipe_id,如果不指定,默认会生成recipeId这样的列名
4. 数据迁移注意事项
- 原来Recipe表中的
tags列(simple-array类型)要删掉 - 数据库会自动在Tag表新增
recipe_id外键列,关联Recipe的id - 如果要保留原有数据,得手动把原来Recipe的tags数组里的Tag ID,批量更新到对应Tag的
recipe_id字段中
内容的提问来源于stack exchange,提问作者Bowis
相关产品推荐
相关产品推荐

