如何使用 sequelize-typescript 从单个字段中引用多个模型?

Posted

技术标签:

【中文标题】如何使用 sequelize-typescript 从单个字段中引用多个模型?【英文标题】:how do i reference multiple models from a single field with sequelize-typescript? 【发布时间】:2019-03-19 18:11:42 【问题描述】:

我希望将来有多个Address 用于PersonLocationPlace 以及可能的其他实体类型。我想在我的Address 模型上有一个字段,它指向与地址相关的任何事物的id,而不必在每个@ 上都有personIdlocationIdplaceId 等... 987654331@ 当他们只使用其中一个时。

我的表结构如下:

addresses.entityId => people.id | locations.id | places.id

如何在sequelize-typescript 中使用@ForeignKey 进行建模?

我的模型如下所示:

@Table
class Address extends Model<Address> 
  @Column(
    type: DataType.UUID,
    allowNull: false,
    primaryKey: true,
    unique: true,
    defaultValue: DataType.UUIDV4
  )
  id: string;

  @ForeignKey // ... ??
  entityId: string;


@Table
class Person extends Model<Person> 
  @Column(
    type: DataType.UUID,
    allowNull: false,
    primaryKey: true,
    unique: true,
    defaultValue: DataType.UUIDV4
  )
  id: string;


@Table
class Location extends Model<Location> 
  @Column(
    type: DataType.UUID,
    allowNull: false,
    primaryKey: true,
    unique: true,
    defaultValue: DataType.UUIDV4
  )
  id: string;


@Table
class Place extends Model<Place> 
  @Column(
    type: DataType.UUID,
    allowNull: false,
    primaryKey: true,
    unique: true,
    defaultValue: DataType.UUIDV4
  )
  id: string;

【问题讨论】:

【参考方案1】:

在 Sequelize Typescript 的这种情况下,可以多次给出自定义装饰器,所以如果你想将列引用到多个模型,那么你可以像我给出的 sn-p 一样多次给出 @ForeignKey。 你可以这样做:

@Table
class Address extends Model<Address> 
    @Column(
      type: DataType.UUID,
      allowNull: false,
      primaryKey: true,
      unique: true,
      defaultValue: DataType.UUIDV4
    )
    id: string;
    @ForeignKey(() => Person)
    @ForeignKey(() => Location)
    @ForeignKey(() => Place)
    @Column()
    public entityId: string;
 

参考: Sequelize Typescript Documentation

【讨论】:

以上是关于如何使用 sequelize-typescript 从单个字段中引用多个模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Sequelize-Typescript 模型定义指定 NestJs 控制器的返回类型?

sequelize-typescript - 当使用带有 `tsc` 编译器(带有 NestJS)的 glob 配置时,无法解析模型模块

Node.js 和 sequelize-typescript - 数据访问对象和业务对象

sequelize-typescript:模型中get()的通用方法

Sequelize-typescript 'HasManyCreateAssociationMixin' 不是函数

sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组