Sequelize 中如何优雅地使用查询范围的方法

阅读时长 7 分钟读完

查询范围 (Scopes) 是 Sequelize ORM 中常用的一种方法,它可以帮助我们更好地组织模型的查询逻辑。在使用 Sequelize 中开发 Web 应用时,优雅地使用查询范围方法可以提高代码可读性和可维护性。在本文中,我们将深入探讨 Sequelize 中如何优雅地使用查询范围的方法,并通过示例代码进行讲解。

1. Scopes 概述

Sequelize 中的查询范围 (Scopes) 是一种让你预定义一些常用的查询方法的机制。换句话说,查询范围是一个函数集,每个函数定义了一个查询方法,而这个查询方法可以被模型对象调用。在模型中使用查询范围可以帮助我们更好地组织模型的查询逻辑,提高代码的可读性和可维护性。

查询范围的定义方式有两种:

1.1 静态方法定义

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

上面的代码中,我们在 User 模型中定义了一个 recentlyActive 的查询范围,表示最近登录的用户。其中 where 表示查询条件,order 表示排序方式。

我们可以通过以下方式调用这个查询范围:

1.2 实例方法定义

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

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

上面的代码中,我们在 User 模型的原型上定义了一个 recentlyActive 方法,表示最近登录的用户。这个方法返回一个查询范围对象,表示查询条件和排序方式。

我们可以通过以下方式调用这个查询范围:

2. Scopes 的语法

查询范围的语法包括以下几个部分:

2.1 where

查询条件,可以是一个对象或一个函数。

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

2.2 order

排序方式,可以是一个数组或一个函数。

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

2.3 limit

限制返回结果的数量。

2.4 offset

返回结果的偏移量。

2.5 attributes

返回结果的字段,可以是一个数组或一个函数。

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

3. Scopes 的使用示例

为了方便演示,我们以用户 (User) 模型为例来说明查询范围的使用方法。

3.1 基本查询范围

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

上面的代码中,我们定义了一个基本查询范围 defaultScope,表示查询用户时只返回 idnameemail 字段。

3.2 带条件的查询范围

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

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

上面的代码中,我们定义了一个查询范围 recentlyRegistered,它表示前 10 个注册时间早于当前时间的以 J 或 M 开头的用户。这个查询范围包括一个 where 条件、一个 order 排序和一个 limit 限制。

3.3 多个查询范围

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

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

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

上面的代码中,我们定义了两个查询范围 recentlyActiveinactive,分别表示最近 7 天登录过的和最近 30 天未登录的用户。这两个查询范围都包含一个 where 条件和一个 order 排序。我们可以通过 Model.scope() 来调用不同的查询范围。

4. 总结

查询范围 (Scopes) 是 Sequelize ORM 中常用的一种方法,它可以帮助我们更好地组织模型的查询逻辑。在使用 Sequelize 中开发 Web 应用时,优雅地使用查询范围方法可以提高代码可读性和可维护性。通过本文的讲解,希望大家能更好地了解 Sequelize 中查询范围的使用方法。

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

纠错
反馈