当前位置: 首页 > 文档资料 > Sequelize ORM 实践 >

3.3 一对多

优质
小牛编辑
129浏览
2023-12-01

一个人可以有很多本书就是一对多关系,用编程语言来描述就是 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