这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战
获取器, 设置器 和 虚拟字段
Sequelize 允许模型的属性定义自定义获取器和设置器.
Sequelize 还允许指定 虚拟属性,它们是 Sequelize 模型上的属性,这些属性在基础 SQL 表中实际上并不存在,而是由 Sequelize 自动填充
获取器
获取器是为模型定义中的一列定义的 get() 函数:
const User = sequelize.define('user', {
// 假设我们想要以大写形式查看每个用户名,
// 即使它们在数据库本身中不一定是大写的
username: {
type: DataTypes.STRING,
get() {
const rawValue = this.getDataValue('username');
return rawValue ? rawValue.toUpperCase() : null;
}
}
});
在读取字段值时会自动调用此获取器:
const user = User.build({ username: 'SuperUser123' });
console.log(user.username); // 'SUPERUSER123'
console.log(user.getDataValue('username')); // 'SuperUser123'
注意,记录为 SUPERUSER123,但是真正存储在数据库中的值仍然是 SuperUser123,使用了 this.getDataValue('username') 来获得该值,并将其转换为大写.
设置器
设置器是为模型定义中的一列定义的 set() 函数. 接收要设置的值:
const User = sequelize.define('user', {
username: DataTypes.STRING,
password: {
type: DataTypes.STRING,
set(value) {
// 在数据库中以明文形式存储密码是很糟糕的.
// 使用适当的哈希函数来加密哈希值更好.
this.setDataValue('password', hash(value));
}
}
});
Sequelize 在将数据发送到数据库之前自动调用了设置器. 数据库得到的唯一数据是已经散列过的值.
如果想将模型实例中的另一个字段包含在计算
const User = sequelize.define('user', {
username: DataTypes.STRING,
password: {
type: DataTypes.STRING,
set(value) {
// 在数据库中以明文形式存储密码是很糟糕的.
// 使用适当的哈希函数来加密哈希值更好.
// 使用用户名作为盐更好.
this.setDataValue('password', hash(this.username + value));
}
}
});
组合获取器和设置器
获取器和设置器都可以在同一字段中定义.
虚拟字段
虚拟字段是 Sequelize 在后台填充的字段,但实际上它们不存在于数据库中,
Sequelize 在模型定义中还提供了 getterMethods 和 setterMethods 参数,以指定看起来像但与虚拟属性不完全相同的事物.