Sequelize
  • Introduction
  • 写在前面的话
  • 第一章 搭建环境
  • 第二章 模型定义
    • 2.1 实例变量方法
    • 2.2 定义一个模型
    • 2.3 模型字段类型
    • 2.3 导入与配置
  • 第三章 模型关系
    • 3.1 属于
    • 3.2 包含
    • 3.3 一对多
    • 3.4 多对多
    • 3.5 多态一对多
    • 3.6 多态多对多
    • 3.7 关系嵌套
  • 第四章 模型查询
  • 第五章 查询范围 Scope (预定义查询条件)
  • 第六章 生命周期函数 Hook
  • 第七章 数据库迁移 Migrate
  • 第八章 根据 Table 生成 Model
Powered by GitBook
On this page
  • 声明属于关系
  • user.ts
  • index.ts
  1. 第三章 模型关系

3.2 包含

声明属于关系

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

User.hasOne(Book);

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

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

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

user.ts

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

// interface UserInstance

Book: Sequelize.HasOneGetAssociationMixin<BookInstance>,
setBook: Sequelize.HasOneSetAssociationMixin<BookAttributes, number>,
createBook: Sequelize.HasOneCreateAssociationMixin<BookAttributes>

声明包含关系

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

index.ts

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

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

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

0.0 Nice Work~

Previous3.1 属于Next3.3 一对多

Last updated 7 years ago