Sequelize 中的模型定义和关联详解

阅读时长 7 分钟读完

前言

Sequelize 是一个 Node.js ORM(Object-Relational Mapping) 框架,它能够帮助我们很方便地与数据库交互。在使用 Sequelize 进行数据库操作时,模型定义和关联是非常重要的概念。本篇文章将对 Sequelize 中的模型定义和关联进行详解,并提供相应的示例代码。

模型定义

在 Sequelize 中,我们需要定义一个模型来与数据库中的表对应。定义模型的方式非常简单,只需要按照以下格式定义即可:

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

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

其中,sequelize.define() 方法用于定义一个模型,第一个参数为模型的名称,第二个参数为定义模型的字段。

定义字段时,需要传入一个对象,该对象包含字段名和字段类型。例如:

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

上述代码定义了一个名为 User 的模型,包含了 usernamepasswordage 三个字段。其中,usernamepassword 的类型为字符串,且不允许为空;age 的类型为整数。

上面的字段类型 DataTypes.STRINGDataTypes.INTEGER 等均为 Sequelize 提供的数据类型。完整的数据类型列表可以参考官方文档:Sequelize DataTypes

模型方法

除了定义字段,我们还可以在模型中定义方法,以实现一些自定义的逻辑。例如,在 UserModel 模型中定义一个方法 checkPassword(),用于检查用户输入的密码是否与存储在数据库中的密码匹配:

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

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

上述代码中,我们使用了 async/await 和 bcrypt 库来实现了一个简单的密码检查方法。

在实际使用中,我们可以像以下这样调用 checkPassword() 方法:

模型实例方法和类方法

在 Sequelize 中,我们可以分别定义实例方法和类方法。

实例方法是指在获取一个数据库实例对象之后,可以调用该对象上的方法,例如上述中的 checkPassword() 方法。

而类方法是指在模型上定义的方法,可以直接调用模型上的方法,不需要获取实例。例如,我们可以定义一个类方法来实现按照用户名进行查询:

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

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

上述代码定义了一个名为 findByUsername 的类方法,用于按照用户名查询用户。我们可以像以下这样调用该方法:

关联

在 Sequelize 中,我们还可以定义表之间的关联关系,以方便我们进行查询和操作。定义关联关系时,需要分为两步:

  1. 在模型定义中添加关联信息;
  2. 使用 modelName.belongsTo(targetModelName)modelName.hasOne(targetModelName)modelName.hasMany(targetModelName) 方法定义关联关系。

关联类型

在 Sequelize 中,我们有三种关联类型:

  • belongsTo:表示该模型属于另一个模型,即该模型包含一个外键指向另一个模型;
  • hasOne:表示该模型拥有一个与另一个模型相关联的实例;
  • hasMany:表示该模型拥有多个与另一个模型相关联的实例。

示例

下面我们以一个简单的博客系统为例,定义博客系统中的模型和关联关系。博客系统中包含以下几个模型:

  • User:表示博客系统中的用户;
  • Blog:表示博客系统中的博客;
  • Comment:表示博客系统中的评论。

其中的关联关系如下:

  • User 与 Blog 为一对多关系,即一个用户可以发表多篇博客;
  • Blog 与 Comment 为一对多关系,即一篇博客可以被多个评论所评论;
  • User 与 Comment 为一对多关系,即一位用户可以发表多个评论。

我们可以按照以下方式定义这些模型和关联关系:

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

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

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

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

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

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

上述代码中,我们首先定义了三个模型:User、Blog 和 Comment。接下来,我们使用了 modelName.hasMany(targetModelName)modelName.belongsTo(targetModelName) 等方法来定义了它们之间的关联关系。

总结

通过本篇文章,我们了解了 Sequelize 中的模型定义和关联类容。通过定义模型和定义关联关系,我们可以很方便地进行数据库操作,同时也能使我们的代码更加简洁优雅。

完整示例代码:https://github.com/dora-uu/sequelize-demo

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

纠错
反馈