什么是 Sequelize
Sequelize 是一个使用 Node.js 实现的基于 Promise 的 ORM(Object-Relational Mapping)框架,它提供了基于 JavaScript 对象与关系数据库表之间进行映射的能力,方便了开发者在 Node.js 中进行数据库操作。
使用 Sequelize 可以不用手写 SQL 语句,而是使用对象进行 CRUD 操作,对于用户输入的不合法数据以及 SQL 注入攻击等安全问题可以在数据层解决。
联接类型
在 Sequelize 中,从一对一到一对多,再到多对多的关系都可以被定义并统一操作。定义模型时,可以通过一些工具方法来简单地创建各种类型的关系。
Sequelize 中支持一下五种关系类型:
belongsTo
: 外键是存在在源模型中的。hasOne
: 外键是存在在目标模型中的。hasMany
: 外键是存在在目标模型中的。belongsToMany
: 通过中间表将两个模型相互关联起来,中间表将被命名为模型的名称,源模型的名称和目标模型的名称,按照字典序排序后连接而成。
使用实例
以下是两个表的定义:
-- -------------------- ---- ------- -- ------ ----- ---- ------- ----- -- ----------- ----- ----------------- ---- ------------------ -- - ---------- ---------- ------ --- -- ------ ----- ---- ------- ----- -- ----------- ------ ----------------- -------- --------------- ------- ------------------ -- - ---------- ---------- ------ ---
其中,文章表的 userId 属性是外键,它引用了用户表的 id 属性。我们会将两个模型相互关联到一起。
一对多的关系
一个用户可以发布多篇文章,这是一对多的关系。因此,在文章模型中,我们应当使用 belongsTo
方法将外键定义在源模型(文章)中:
Post.belongsTo(User);
然后,我们可以通过 Post.findAll()
获取所有文章及其对应的用户信息:
const posts = await Post.findAll({ include: User }); console.log(posts[0].user.name); // 输出该文章对应的用户的名称
多对多的关系
一个用户可以关注多个用户,一个用户也可以拥有多个粉丝,这是多对多的关系。
我们需要创建一个关注表,来存储两个用户之间的关系。
// 创建关注表 class Follow extends Model {} Follow.init({}, { sequelize, modelName: 'follow' }); // 定义关系 User.belongsToMany(User, { as: 'followers', through: Follow, foreignKey: 'followingId' }); User.belongsToMany(User, { as: 'followings', through: Follow, foreignKey: 'followerId' });
上面代码中,User.belongsToMany(User)
表示一个用户可以关注多个用户,也可以拥有多个粉丝。as
参数用于指定关联对象在 Sequelize 中的名称,through
参数指定关联的中间表,foreignKey
指定外键的名称。
我们可以通过以下方式查询该用户关注的所有用户:
const user = await User.findByPk(1); const followings = await user.getFollowings() console.log(followings[0].name); // 输出该用户关注的第一个用户名称
总结
本文介绍了 Sequelize 的多表关联方法,包括了一对多和多对多的关系,并给出了典型的使用实例。
Sequelize 提供了丰富的操作,可以很好地帮助我们管理数据库,从应用程序的角度来看,Sequelize 的最大优点就是它允许我们使用面向对象的方式进行数据库操作,提高了开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645e3fa6968c7c53b00a1cb5