包含

声明属于关系

声明是属于关系的方法是 hasOne

  1. User.hasOne(Book);

假如只想让用户只能有一本书,可以通过 hasOne 来声明,与 belongsTo 的区别的就是,主体模型就是 User,所以会在 User 模型上面添加 setBook、createBook、book 的一些方法和属性,并且会在 Book 表里面增加一个 userId 来建立包含关系。

谁是主体模型,就在谁上面添加方法,以 hasXXXX 开头的声明关系函数,都会把关系字段放在后面那个模型表里面。

在上一个例子中,我们添加一下 User 模型关于 Book 的一些方法

user.ts

首先声明一些方法与属性。

  1. // interface UserInstance
  2. Book: Sequelize.HasOneGetAssociationMixin<BookInstance>,
  3. setBook: Sequelize.HasOneSetAssociationMixin<BookAttributes, number>,
  4. createBook: Sequelize.HasOneCreateAssociationMixin<BookAttributes>

声明包含关系

  1. (User as any).associate = function(this: typeof User,models){
  2. this.hasOne(models.Book);
  3. }

index.ts

  1. const user = await User.findOne({
  2. where: {id: 1},
  3. include: [{ model: Book }]
  4. });
  5. console.log(user.Book);

include: [{ model: Book }] 是为了把相关的模型给查出来,也就是 Book,运行一下,就可以看到打印出了数据。

通过 belongsTohasOne 实现了一对一模型关系,在 User 可以拿到 Book,在 Book 可以拿到 User,而有一点需要注意的是,你想让建立关系的字段放在哪,可以通过前面说的hasXXX关系字段在后面的原则,先写好 hasXXX 之后在写 belongsTo 关系,这样就能避免搞不清楚关系字段在哪的问题。

0.0 Nice Work~