Sequelize 之 hasMany & belongsTo 关系详解

阅读时长 6 分钟读完

在 Web 应用的开发过程中,经常需要用到关系型数据库来存储和管理应用程序的各种数据。Sequelize 是一个使用方便的 ORM(Object-Relational Mapping)框架,可以轻松地在 Node.js 中操作 MySQL、PostgreSQL、SQLite、MariaDB 等多种数据库。Sequelize 的一个重要概念就是模型之间的关系,本文将详细介绍 Sequelize 中的 hasMany 和 belongsTo 关系,并提供实用的示例代码。

什么是关系型数据库?

在讲解 Sequelize 的关系前,我们先来回顾下什么是关系型数据库。

在关系型数据库中,数据以表格形式存储,表格中的每一行代表一条记录,每一列代表一种数据类型。表格通过一种称为“键”的特殊列进行链接,比如主键或外键。关系型数据库最大的优点是可以方便地进行关系查询和数据分析,如 SQL 中的 JOIN 操作。

关系型数据库的一个经典应用场景就是用户和文章之间的关系。我们可以将用户信息和文章信息分别存储在两张表中,通过外键将两张表关联起来,这样每篇文章就可以知道它的作者是谁,每个作者也可以知道自己写了哪些文章。

Sequelize 的关系定义

Sequelize 采用“模型”(Model)的概念来抽象出表格中的记录,在模型中,每个属性对应表格中的一列,每个模型对应表格中的一张表。Sequelize 中的关系就是不同模型之间的互动关系。

Sequelize 定义关系的方法是通过调用模型中的关系方法。Sequelize 提供了4种关系方法:

  • hasOne:一对一关系,一个模型实例对应另一个模型实例。
  • belongsTo:一对一关系,一个模型实例属于另一个模型实例。
  • hasMany:一对多关系,一个模型实例可以对应多个另一个模型实例。
  • belongsToMany:多对多关系,一个模型实例可以对应多个另一个模型实例,反之亦然。

本文将详细介绍 hasMany 和 belongsTo 这两种关系。

hasMany 关系

hasMany 关系用于一对多关系的场景,即一个模型实例对应多个另一个模型实例。以用户和文章为例,一个用户可以有多篇文章,每篇文章只属于一个用户,因此 User 模型具有多个 Article 模型的关系,可以使用 hasMany 方法来定义这种关系。

-- -------------------- ---- -------
----- ---- - ------------------------ -
  ----- -----------------
  ---- -----------------
---

----- ------- - --------------------------- -
  ------ -----------------
  -------- --------------
---

----------------------
展开代码

在 User 模型中调用 hasMany 方法来定义 Article 模型的关系,这里的参数 Article 是一个字符串或模型对象,表示目标模型的名称或 Sequelize 模型。调用 User.hasMany(Article) 后,Sequelize 会在 Article 模型中自动添加 user_id 字段,表示 User 模型中的主键,也就是 User 模型实例所对应的用户 ID。

接下来,我们可以使用 User 模型的 getArticles 和 setArticles 方法来访问该关系:

-- -------------------- ---- -------
-------------------------- -- -
  -------------------------------- -- -
    --------------------- - --- --------- -- -------------------- -- ----------------
  ---
---

-------------------------- -- -
  --------------------------- ------------------ -- -
    --------------------- - --- -------- ---- ---- -------
  ---
---
展开代码

上面的代码通过 findByPk 方法获取用户实例,然后调用 getArticles 方法来获取该用户实例对应的文章实例。另外,使用 setArticles 方法可以将一组文章实例关联到用户实例上。

belongsTo 关系

belongsTo 关系用于一对一关系的场景,即一个模型实例属于另一个模型实例。以文章和用户为例,一篇文章只属于一个用户,每个用户可以有多篇文章,因此 Article 模型具有一个 User 模型的关系,可以使用 belongsTo 方法来定义这种关系。

-- -------------------- ---- -------
----- ------- - --------------------------- -
  ------ -----------------
  -------- --------------
---

----- ---- - ------------------------ -
  ----- -----------------
  ---- -----------------
---

------------------------
展开代码

在 Article 模型中调用 belongsTo 方法来定义 User 模型的关系,这里的参数 User 是一个字符串或模型对象,表示目标模型的名称或 Sequelize 模型。调用 Article.belongsTo(User) 后,Sequelize 会在 Article 模型实例中自动添加 user_id 字段,表示 User 模型实例的主键,也就是 User 模型实例所对应的用户 ID。

接下来,我们可以使用 Article 模型的 get/setUser 方法来访问该关系:

-- -------------------- ---- -------
--------------------------------- -- -
  --------------------------- -- -
    ------------------------- - --- ------- -- -----------
  ---
---

--------------------------------- -- -
  ----------------------------- -- -
    ------------------------- - --- ------ --- ---- -------
  ---
---
展开代码

上面的代码通过 findByPk 方法获取文章实例,然后调用 getUser 方法来获取该文章实例对应的用户实例。另外,使用 setUser 方法可以将一篇文章关联到一个用户实例上。

小结

Sequelize 是 Node.js 中使用广泛的 ORM 框架之一,可以轻松地操作多种关系型数据库。在使用 Sequelize 时,需要注意模型之间的关系定义,包括 hasOne、belongsTo、hasMany、belongsToMany 4种关系,本文对其中的 hasMany 和 belongsTo 进行了详细的介绍,并提供了实用的示例代码供参考。

通过本文的学习和实践,相信读者已经掌握了 Sequelize 中的关系定义和操作方法,可以在项目开发中更加便捷地使用 Sequelize 并处理好数据的关系。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/679437e5504e4ea9bd8aeb38

纠错
反馈

纠错反馈