关于Sequelize连接查询时inlude中model和association的区别详解

关于 Sequelize 连接查询时 include 中 model 和 association 的区别详解

Sequelize 是一个 Node.js 的 ORM 框架,它支持多种数据库,包括 PostgreSQL、MySQL、SQLite 和 Microsoft SQL Server 等。在 Sequelize 中,使用 include 参数可以进行连接查询,同时也可以通过指定 model 和 association 的方式来深度查询相关联的数据。

model 和 association 的概念

在 Sequelize 中,每个模型都有一个关联关系表,用于记录与其它模型之间的关联。这些关联可以分为以下几种类型:

  • BelongsTo:表示一对一或一对多关系中,当前模型是从属方(即外键存在于当前模型)。
  • HasOne:表示一对一关系中,当前模型是拥有方(即外键存在于另一个模型)。
  • HasMany:表示一对多关系中,当前模型是拥有方(即外键存在于另一个模型)。
  • BelongsToMany:表示多对多关系,需要定义一个中间表。

association 表示两个模型之间的关联关系,而 model 则表示要查询的模型本身。

include 中 model 和 association 的区别

使用 model

在 include 中使用 model,可以直接查询指定模型的数据,不会查询任何关联数据。例如,如果我们要查询一个名为 User 的模型中 id 为 1 的用户,代码如下:

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

这里的 include 中指定了关联模型 Role,但是并没有指定任何关联关系,因此只查询了 User 和 Role 两个表中的数据。

使用 association

在 include 中使用 association,则会基于关联关系进行深度查询。我们可以通过传递关联名称来实现。例如,如果一个名为 User 的模型与一个名为 Role 的模型有 BelongsTo 关系,那么可以通过 'role' 关联名称来查询该用户所对应的角色信息,代码如下:

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

这里的关联名称为 'role',表示查询 User 模型中外键所指向的 Role 表。

除了直接使用关联名称,也可以在定义模型时指定别名,然后在 include 中使用该别名。例如:

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

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

这里的 as 参数用来指定关联名称的别名,这样在 include 中就可以使用别名了。

指导意义

使用 Sequelize 进行连接查询时,可以根据需要选择使用 model 或 association 来查询相关联的数据。对于仅需查询指定模型的数据而不需要查询任何关联数据的场景,使用 model 更加方便;而对于需要深度查询相关联数据的场景,则需要使用 association。

在使用 include 参数时,我们还可以进一步指定 where、attributes 和 limit 等参数来对查询结果进行过滤和控制。这些参数的详细介绍可以参考 Sequelize 官方文档。

示例代码

以下是一个使用 Sequelize 进行连接查询的示例代码,其中 User 和 Role 两个模型通过 BelongsTo 关系关联:

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

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

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

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

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

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

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

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

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