sequelize

Sequelize | 8. 模型 - 获取器/设置器/虚拟字段

2021-01-26  本文已影响0人  ShadowFieldEric
  1. 获取器与设置器是在模型定义时,对数据项进行输入与输出的数据处理,一般用于自动填充、格式化输入输出等功能。
    数据项属性中的get()方法即获取器,set(value)方法即设置器。如下述定义中的first_name数据项。
  2. 虚拟字段是在模型定义时,对数据库字段内容进行组合或处理后得到的新字段,这个类型的字段不需要存储在数据库中,一般用于后台数据的填充。
    数据项属性中的类型属性,设置为DataTypes.VIRTUAL,即可该数据项为虚拟字段。如下述定义中的full_name数据项。
const { Sequelize, Model, DataTypes } = require('sequelize');
const { Op } = require('sequelize');
const config = require('./config/mysql.config');

const sequelize = new Sequelize(config.database, config.username, config.password, {
  host: config.host,
  dialect: config.dialect,
  pool: config.pool
});

class UserModel extends Model { }
UserModel.init({
  first_name: {
    type: DataTypes.STRING,
    get() {
      let first_name = this.getDataValue('first_name');
      return first_name ? first_name.toUpperCase() : null;
    },
    set(value) {
      let first_name = value ? value.toUpperCase() : null;
      this.setDataValue('first_name', first_name);
    },
    allowNull: false
  },
  last_name: {
    type: DataTypes.STRING,
    allowNull: true
  },
  full_name: {
    type: DataTypes.VIRTUAL,
    get() {
      return `${this.first_name} ${this.last_name}`;
    },
    set(value) {
      throw new Error('Donot set `fullName` value');
    }
  },
  birthday: {
    type: DataTypes.DATEONLY,
    allowNull: true
  },
  sex: {
    type: DataTypes.ENUM('male', 'female'),
    allowNull: true
  },
  teacher_id: {
    type: Sequelize.INTEGER,
    references: {
      model: 't_teachers',
      key: 'id'
    }
  },
  enable: {
    type: DataTypes.BOOLEAN,
    allowNull: true,
    defaultValue: true
  }
}, {
  sequelize,
  modelName: 't_users',
  freezeTableName: true,
  timestamps: false
});

(async () => {
  let user_4 = await UserModel.findAll({
    where: {
      first_name: 'guangming'
    }
  });
  console.log(user_4);
  console.log(JSON.stringify(user_4, null, 2));
})();

(async () => {
  await UserModel.create({
    first_name: 'chen',
    last_name: 'chen',
    birthday: '2020-05-20',
    sex: 'male',
    teacher_id: 1,
    enable: 1
  });
})();
上一篇 下一篇

猜你喜欢

热点阅读