Getters & setters

可以在模型上定义’对象属性’getter和setter函数,这些可以用于映射到数据库字段的“保护”属性,也可以用于定义“伪”属性.

Getters和Setters可以通过两种方式定义(你可以混合使用这两种方式):

  • 作为属性定义的一部分
  • 作为模型参数的一部分

注意: 如果在两个地方定义了getter或setter,那么在相关属性定义中找到的函数始终是优先的.

定义为属性定义的一部分

  1. class Employee extends Model {}
  2. Employee.init({
  3. name: {
  4. type: Sequelize.STRING,
  5. allowNull: false,
  6. get() {
  7. const title = this.getDataValue('title');
  8. // 'this' 允许你访问实例的属性
  9. return this.getDataValue('name') + ' (' + title + ')';
  10. },
  11. },
  12. title: {
  13. type: Sequelize.STRING,
  14. allowNull: false,
  15. set(val) {
  16. this.setDataValue('title', val.toUpperCase());
  17. }
  18. }
  19. }, { sequelize, modelName: 'employee' });
  20. Employee
  21. .create({ name: 'John Doe', title: 'senior engineer' })
  22. .then(employee => {
  23. console.log(employee.get('name')); // John Doe (SENIOR ENGINEER)
  24. console.log(employee.get('title')); // SENIOR ENGINEER
  25. })

定义为模型参数的一部分

以下是在模型参数中定义 getter 和 setter 的示例.

fullName getter,是一个说明如何在模型上定义伪属性的例子 - 这些属性实际上不是数据库模式的一部分. 事实上,伪属性可以通过两种方式定义:使用模型getter,或者使用虚拟数据类型的列. 虚拟数据类型可以有验证,而虚拟属性的getter则不能.

请注意,fullName getter函数中引用的this.firstnamethis.lastname将触发对相应getter函数的调用. 如果你不想这样,可以使用getDataValue()方法来访问原始值(见下文).

  1. class Foo extends Model {
  2. get fullName() {
  3. return this.firstname + ' ' + this.lastname;
  4. }
  5. set fullName(value) {
  6. const names = value.split(' ');
  7. this.setDataValue('firstname', names.slice(0, -1).join(' '));
  8. this.setDataValue('lastname', names.slice(-1).join(' '));
  9. }
  10. }
  11. Foo.init({
  12. firstname: Sequelize.STRING,
  13. lastname: Sequelize.STRING
  14. }, {
  15. sequelize,
  16. modelName: 'foo'
  17. });
  18. // 或使用 `sequelize.define`
  19. sequelize.define('Foo', {
  20. firstname: Sequelize.STRING,
  21. lastname: Sequelize.STRING
  22. }, {
  23. getterMethods: {
  24. fullName() {
  25. return this.firstname + ' ' + this.lastname;
  26. }
  27. },
  28. setterMethods: {
  29. fullName(value) {
  30. const names = value.split(' ');
  31. this.setDataValue('firstname', names.slice(0, -1).join(' '));
  32. this.setDataValue('lastname', names.slice(-1).join(' '));
  33. }
  34. }
  35. });

用于 getter 和 setter 定义内部的 Helper 方法

  • 检索底层属性值 - 总是使用 this.getDataValue()
  1. /* 一个用于 'title' 属性的 getter */
  2. get() {
  3. return this.getDataValue('title')
  4. }
  • 设置基础属性值 - 总是使用 this.setDataValue()
  1. /* 一个用于 'title' 属性的 setter */
  2. set(title) {
  3. this.setDataValue('title', title.toString().toLowerCase());
  4. }

注意: 坚持使用 setDataValue()getDataValue() 函数(而不是直接访问底层的“数据值”属性)是非常重要的 - 这样做可以保护你的定制getter和setter不受底层模型实现的变化.