在TypeORM中创建映射表,其中1列可以引用多个表

问题描述 投票:0回答:1

我想在 TypeORM 实体中创建这个设计:

这个想法是列表可以包含任意数量、任意类型的项目。现在有两种类型的项目:待办事项和雇用。未来可能还会有更多。

这些是列表、待办事项和雇用实体:

@Entity()
export class List {
  @PrimaryGeneratedColumn()
  id: number

  @OneToMany(() => Item, (item) => item.list)
  items: Item[]

  @Column({
    length: 60,
  })
  title: string
}

@Entity()
export class Todo {
  @PrimaryGeneratedColumn()
  id: number

  @OneToOne(() => Item)
  item: Item

  @Column({
    length: 60,
  })
  title: string

  @Column('text')
  description: string

  @Column({ default: false })
  done: boolean
}

@Entity()
export class Hire {
  @PrimaryGeneratedColumn()
  id: number

  @OneToOne(() => Item)
  item: Item

  @Column({
    length: 60,
  })
  title: string

  @Column('datetime')
  startDate: string

  @Column('datetime')
  endDate: string
}

在映射表中,如何让TypeORM知道

entityId
可以是什么类型?

@Entity()
export class Item {
  @PrimaryGeneratedColumn()
  id: number

  @ManyToOne(() => List, (list) => list.items)
  @JoinColumn()
  list: List

  @Column()
  entityType: string

  @OneToOne(() => Todo /* Todo OR Hire */, (itemType) => itemType.item)
  entity: Todo // Todo OR Hire
}

可以通过做一些不同的事情来规避整个问题吗?

typescript database-design nestjs typeorm
1个回答
1
投票

我可能会遗漏细节,但我想知道它是否不适用于继承,根据您描述问题的方式:

列表

@Entity()
export class List {
  @PrimaryGeneratedColumn()
  id: number

  @OneToMany(() => Item, (item) => item.list)
  items: Item[]

  @Column({
    length: 60,
  })
  title: string
}

项目

@Entity()
export abstract class Item {
  @PrimaryGeneratedColumn()
  id: number

  @ManyToOne(() => List, (list) => list.items)
  @JoinColumn()
  list: List

  @Column()
  entityType: string
}

都都

@Entity()
export class Todo extends Item {
  @PrimaryGeneratedColumn()
  id: number

  @Column({
    length: 60,
  })
  title: string

  @Column('text')
  description: string

  @Column({ default: false })
  done: boolean
}

雇用

@Entity()
export class Hire extends Item {
  @PrimaryGeneratedColumn()
  id: number

  @Column({
    length: 60,
  })
  title: string

  @Column('datetime')
  startDate: string

  @Column('datetime')
  endDate: string
}
© www.soinside.com 2019 - 2024. All rights reserved.