查询范围 (Scopes) 是 Sequelize ORM 中常用的一种方法,它可以帮助我们更好地组织模型的查询逻辑。在使用 Sequelize 中开发 Web 应用时,优雅地使用查询范围方法可以提高代码可读性和可维护性。在本文中,我们将深入探讨 Sequelize 中如何优雅地使用查询范围的方法,并通过示例代码进行讲解。
1. Scopes 概述
Sequelize 中的查询范围 (Scopes) 是一种让你预定义一些常用的查询方法的机制。换句话说,查询范围是一个函数集,每个函数定义了一个查询方法,而这个查询方法可以被模型对象调用。在模型中使用查询范围可以帮助我们更好地组织模型的查询逻辑,提高代码的可读性和可维护性。
查询范围的定义方式有两种:
1.1 静态方法定义
-- -------------------- ---- ------- ----- ---- - ------------------------ - -- ---- -- -- - -- ------ ------- - --------------- - ------ - ------------ - -------- ---------- - - - -- - -- - -- - ---- - -- ------ ---------------- -------- - - ---
上面的代码中,我们在 User
模型中定义了一个 recentlyActive
的查询范围,表示最近登录的用户。其中 where
表示查询条件,order
表示排序方式。
我们可以通过以下方式调用这个查询范围:
const users = await User.scope("recentlyActive").findAll();
1.2 实例方法定义
-- -------------------- ---- ------- ----- ---- - ------------------------ - -- ---- -- --- -- ------ ----------------------------- - -------- -- - ------ - ------ - ------------ - -------- ---------- - - - -- - -- - -- - ---- - -- ------ ---------------- -------- -- --
上面的代码中,我们在 User
模型的原型上定义了一个 recentlyActive
方法,表示最近登录的用户。这个方法返回一个查询范围对象,表示查询条件和排序方式。
我们可以通过以下方式调用这个查询范围:
const user = await User.findByPk(userId, { scope: "recentlyActive" });
2. Scopes 的语法
查询范围的语法包括以下几个部分:
2.1 where
查询条件,可以是一个对象或一个函数。
-- -------------------- ---- ------- -- ----- --- - ------ - ----- ------ - - -- ----- --- - ------ ----------- ---------- -- - ------ - ----- ------- ---------- - ------------------ --- ------ - -- - -
2.2 order
排序方式,可以是一个数组或一个函数。
-- -------------------- ---- ------- -- ----- --- - ------ --------- -------- ------------- ------- - -- ----- --- - ------ ----------- ---------- -- - ------ ------------------------ -------- ---------------------------- -------- - -
2.3 limit
限制返回结果的数量。
{ limit: 10 }
2.4 offset
返回结果的偏移量。
{ offset: 50 }
2.5 attributes
返回结果的字段,可以是一个数组或一个函数。
-- -------------------- ---- ------- -- ---------- --- - ----------- ------ ------- -------- - -- ---------- --- - ----------- ----------- ---------- -- - ------ ------ ------- ---------------------- ------------------------ --------------- - -
3. Scopes 的使用示例
为了方便演示,我们以用户 (User) 模型为例来说明查询范围的使用方法。
3.1 基本查询范围
-- -------------------- ---- ------- ----- ---- - ------------------------ - --- - ----- ------------------ -------------- ----- ----------- ---- -- ----- - ----- ---------------- -- ------ - ----- ---------------- -- ---------- - ----- -------------- -- ---------- - ----- -------------- - -- - -- ------ ------------- - ----------- ------ ------- -------- - ---
上面的代码中,我们定义了一个基本查询范围 defaultScope
,表示查询用户时只返回 id
、name
和 email
字段。
3.2 带条件的查询范围
-- -------------------- ---- ------- -- --- -- ------ ----------------------------------- - ------ ----------- ---------- -- - ------ - ---------- - -------- --- ------ -- -------- - - ----- - ---------- ---- - -- - ----- - ---------- ---- - - - -- -- ------ ------- -------- ------ -- --- -- -- ----- ----- - ----- -------------------------------------------
上面的代码中,我们定义了一个查询范围 recentlyRegistered
,它表示前 10 个注册时间早于当前时间的以 J 或 M 开头的用户。这个查询范围包括一个 where
条件、一个 order
排序和一个 limit
限制。
3.3 多个查询范围
-- -------------------- ---- ------- -- -------------- -- - ----- ------------------------------- - ------ - ------------ - -------- ---------- - - - -- - -- - -- - ---- - -- ------ ---------------- -------- --- -- --------------- -- -- ----- ------------------------- - ------ - ------------ - -------- ---------- - -- - -- - -- - -- - ---- - -- ------ ---------------- -------- --- -- -- ----- ------------------- - ----- --------------------------------------- ----- ------------- - ----- ---------------------------------
上面的代码中,我们定义了两个查询范围 recentlyActive
和 inactive
,分别表示最近 7 天登录过的和最近 30 天未登录的用户。这两个查询范围都包含一个 where
条件和一个 order
排序。我们可以通过 Model.scope()
来调用不同的查询范围。
4. 总结
查询范围 (Scopes) 是 Sequelize ORM 中常用的一种方法,它可以帮助我们更好地组织模型的查询逻辑。在使用 Sequelize 中开发 Web 应用时,优雅地使用查询范围方法可以提高代码可读性和可维护性。通过本文的讲解,希望大家能更好地了解 Sequelize 中查询范围的使用方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ec3eb2f6b2d6eab3682633