查询范围(预定义条件)

可不可以有一种方式提前定义好 where 条件,然后将这种定义好的条件又可以重新组合呢?答案就是 Scope

  1. const Project = sequelize.define('project', {
  2. // Attributes
  3. }, {
  4. defaultScope: {
  5. where: {
  6. active: true
  7. }
  8. },
  9. scopes: {
  10. deleted: {
  11. where: {
  12. deleted: true
  13. }
  14. },
  15. activeUsers: {
  16. include: [
  17. { model: User, where: { active: true }}
  18. ]
  19. },
  20. random: function () {
  21. return {
  22. where: {
  23. someNumber: Math.random()
  24. }
  25. }
  26. },
  27. accessLevel: function (value) {
  28. return {
  29. where: {
  30. accessLevel: {
  31. $gte: value
  32. }
  33. }
  34. }
  35. }
  36. }
  37. });

在这个例子中,defaultScope 就是默认的条件,也就是说当 Project 在使用查询的时候,会自动把该配置项下面的选项加到语句中。

如下:

  1. SELECT * FROM projects WHERE active = true

而 scopes 里面定义的,我们可以通过模型的 scope 方法来指定使用哪一个范围。并且可以通过 unscoped 方法与scope(null) 可以移除默认的 scope。

例如:

  1. Project.scope('deleted').findAll();

就会移除默认的 defaultScope

scope 传入参数

当我们 scopes 里面定义的是函数的时候,可以传入函数参数,具体如何传入如下:

  1. Project.scope('random', { method: ['accessLevel', 19]}).findAll();

socope 的组合

当使用 scope 的时候会移除默认的 defaultScope,可以手动加上defaultScope

  1. Project.scope('defaultScope', 'deleted').findAll();
  2. Project.scope(['deleted', 'activeUsers']).findAll();

而对于模型关系的 scope 在模型关系定义里面以及说得非常清楚了,这里就不再进行赘述。