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
  • 示例
  • 1 . 修改 UserInstance 接口,注释掉 hasOne 关系的,写下 hasMany 的
  • 2 . 修改关系声明
  • 3 . 来到 index.ts
  1. 第三章 模型关系

3.3 一对多

一个人可以有很多本书就是一对多关系,用编程语言来描述就是 Person.hasMany(Book),此时的主体是 Person 。这样会为 Person 实例上面添加以下方法。

getBooks 
addBooks
addBook
createBook
removeBook
removeBooks
hasBook
hasBooks
countBooks

而对于 Book 来说,应该是 Book 属于一个人,而不是 Book 有一个人,所以是要用的 blongsTo 方法,即Book.belongsTo(Person),而会为 Book 添加什么方法在上一节里面有提到过,大家可以自行回顾上节内容。

对于一对多关系,会把少的一方的 Id 放在多的一方的表上,即Book 表有一个userId 字段 假如使用 Book.hasOne(person) 声明模型间的关系, 则会在 Person 表上面加一个 userId 字段,也就是说一个用户只能记录一个 id 值,因为这里的 Book 是多的关系,假如第二本书来了,怎么办?难道复制一行用户?那这样岂不是用户有多少本书,User 表里面就有多少条重复的行。哪怕你是土豪,你的数据库空间也不能这样挥霍呀。

示例

继续使用上一节的例子,把一对一关系改成一对多关系,只需要把 hasOne 改成 hasMany 即可。

1 . 修改 UserInstance 接口,注释掉 hasOne 关系的,写下 hasMany 的

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

  getBooks: Sequelize.HasManyGetAssociationsMixin<BookInstance>,
  createBook: Sequelize.HasManyCreateAssociationMixin<BookAttributes, BookInstance>,
  addBook: Sequelize.HasManyAddAssociationMixin<BookInstance, number>,
  addBooks: Sequelize.HasManyAddAssociationsMixin<BookInstance, number>,
  hasBook: Sequelize.HasManyHasAssociationMixin<BookInstance, number>,
  hasBooks: Sequelize.HasManyHasAssociationsMixin<BookInstance, number>,
  removeBook: Sequelize.HasManyRemoveAssociationMixin<BookInstance, number>,
  removeBooks: Sequelize.HasManyRemoveAssociationsMixin<BookInstance, number>,
  countBooks: Sequelize.HasManyCountAssociationsMixin,

2 . 修改关系声明

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

现在就可以使用一对多关系了。

3 . 来到 index.ts

把之前的数据库表删除掉,通过 sync 再次重建,会看到 Book 表有一个 userId 字段。

首先运行下面的代码增加数据

let book = await Book.create({author:'alice', description: 'typescript hand book', status: 'inSale',title:'ts leaning'});
let user = await User.create({email:'belovedyogurt@gmail.com',name: 'yugo'})
book.setUser(user);
await book.save();

之后允许下面的拿到数据,并且通过 getBooks 拿到该用户拥有的所有 books 列表。

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

运行之后可以看到 [ Book { ..... 这就说明我们拿到的是一个数组,模型之间的关系正确连接。

一对一关系使用: belongsTo 、hasOne 一对多关系使用:belongsTo、hasMany

Previous3.2 包含Next3.4 多对多

Last updated 7 years ago