Sequelize框架进阶
传送门
前言
上一篇入门讲到了 Sequelize框架
的基本用法,比如实现简单的增删查改。原本打算一篇文章写到底的,但感觉内容太多,对读者不太友好,就另开了这篇文章。
虽然标题写着“进阶”,但其实有标题党的以为。这篇文章仍然着手于框架的使用,不涉及源码。大纲见侧边栏的目录,我们直接开始吧~
连表查询
准备工作
既然是连表查询,至少得有两个表吧。所以我们还需要另外新建一张表,这里起名为 message
表,表结构如下:
其中 uid 对应用户的 id 。下面是两表的数据:
接着我们新建一个 app2.js
文件,引入之前 app.js
中的部分代码(连接数据库+UserModel)以及创建一个 MessageModel
模型:
1 | const Sequelize = require('sequelize'); |
需求+普通做法
我们这次的需求是获取某条留言的所有数据,其中包含 留言本身的数据
+ 该留言的用户数据
,先来看最“耿直”的做法:
1 | (async () => { |
BelongsTo
除了上面这种做法外,我们还可以使用 sequelize
提供的 BelongsTo
来关联两个模型进行查询。
思考一下我们的 users
和 message
表,从 message
的角度来讲,一条留言属于一个用户发布的,是一对一的关系。而 BelongsTo
关联的含义就是 A 属于 B。那我们应该怎么写代码呢?步骤如下:
首先在模型中给关联的字段定义外键关系
1
2
3
4references: {
model: 关联的外键表模型, e.g. UserModel
key: 关联的外键表的字段, e.g. id
}在调用
belongsTo
或hasMany
等方法的时候,通过第二个参数设置对象1
2
3{
foreignKey: 当前关联表的字段, e.g. uid
}
没有完全理解上面的步骤也没关系,直接上代码更加清晰:
1 | const MessageModel = sequelize.define('Message', { |
HasMany
这次我们换个角度,来通过某个用户查找他/她所有的留言。稍微想一下,一个用户是可以发布多条留言的,所以从 users
角度来讲,跟 message
是一对多的关系。而 sequelize
也提供了处理这种关系的方法,那就是 HasMany
。直接上代码:
1 | (async () => { |
版本
安装的 sequelize 和 mysql2 的版本为:
1 | "dependencies": { |