TypeORM 外键

dew*_*wey 1 postgresql foreign-keys typeorm nestjs

我想将 a 引用module到 a queue。所以一个人queue可以有多个modules. 因此,我只是想存储idmodulequeue

根据 Typeorm 的文档,我应该以这种方式实现这种关系:

@ManyToOne(type => Module)
@JoinColumn({ name: "currentModuleId" })
module: Module;
Run Code Online (Sandbox Code Playgroud)

我只是想提供idmodule,而不是一个模块对象。所以我想出了这个解决方案:

模块实体

@Entity()
export class Module extends BaseEntity {
  @PrimaryColumn({ unique: true })
  public id: string;
}
Run Code Online (Sandbox Code Playgroud)

队列实体

@Entity()
export class Queue extends BaseEntity {
  @PrimaryGeneratedColumn('uuid')
  public id: string;

  @OneToOne(() => Module)
  @JoinColumn({ name: 'currentModuleId' })
  currentModuleId: string;
}
Run Code Online (Sandbox Code Playgroud)

这有效,但我不太相信这是一个防错解决方案。我应该如何为 实现外键queue

另外:Typeorm 如何知道currentModuleId应该引用哪一列?

Sel*_*rim 5

多对一/一对多关系应该可以解决您的问题,

这是一种关系,其中A包含B 的多个实例,但B仅包含A 的一个实例。在您的情况下,A 指的是队列实体,B 指的是模块实体

模块实体

@Entity()
export class Module extends BaseEntity {
  @PrimaryColumn({ unique: true })
  public id: string;

  @ManyToOne(() => Queue, (Queue) => 
           Queue.id, { onUpdate: 'CASCADE', onDelete: 'CASCADE' })
  @JoinColumn({ name: 'ueues' })
  queues: Queue;

}
Run Code Online (Sandbox Code Playgroud)

队列实体

@Entity()
export class Queue extends BaseEntity {
  @PrimaryGeneratedColumn('uuid')
  public id: string;
      @OneToMany(() => Module, Module => 
           Module.queues, { onUpdate: 'CASCADE', onDelete: 'CASCADE' })
      modules: Module[];
}
Run Code Online (Sandbox Code Playgroud)