定义

作用域在模型定义中定义,可以是finder对象或返回finder对象的函数,除了默认作用域,该作用域只能是一个对象:

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

通过调用 addScope 定义模型后,还可以添加作用域. 这对于具有包含的作用域特别有用,其中在定义其他模型时可能不会定义 include 中的模型.

始终应用默认作用域. 这意味着,通过上面的模型定义,Project.findAll() 将创建以下查询:

  1. SELECT * FROM projects WHERE active = true

可以通过调用 .unscoped(), .scope(null) 或通过调用另一个作用域来删除默认作用域:

  1. Project.scope('deleted').findAll(); // 删除默认作用域
  1. SELECT * FROM projects WHERE deleted = true

还可以在作用域定义中包含作用域模型. 这让你避免重复 include,attributeswhere 定义.

使用上面的例子,并在包含的用户模型中调用 active 作用域(而不是直接在该 include 对象中指定条件):

  1. activeUsers: {
  2. include: [
  3. { model: User.scope('active')}
  4. ]
  5. }