我的表中有一个列,它将使用散列模块来散列(字符和整数)表上的自动递增主键。我尝试使用散列模式属性的get
和set
方法来实现此目的,但是永远不会设置该值。
var Hashids = require('hashids');
var hashids = new Hashids('blog', 10);
var blogComment = sequelize.define('blog_comment', {
blogCommentId: {
type: DataTypes.INTEGER,
field: 'blog_comment_id',
autoIncrement: true,
primaryKey: true
},
blogCommentIdHash: {
type: DataTypes.STRING,
field: 'blog_comment_id_hash',
get: function(){
var blogCommentId = this.getDataValue('blogCommentId');
return this.setDataValue('blogCommentIdHash', hashids.encode(blogCommentId));
}
},
...
}
我还尝试了一种不同的设置,我将set
方法附加到具有类似功能的id属性,但仍然没有成功。
var Hashids = require('hashids');
var hashids = new Hashids('blog', 10);
var blogComment = sequelize.define('blog_comment', {
blogCommentId: {
type: DataTypes.INTEGER,
field: 'blog_comment_id',
autoIncrement: true,
primaryKey: true,
set: function(val){
return this.setDataValue('blogCommentIdHash', hashids.encode(val));
}
},
blogCommentIdHash: {
type: DataTypes.STRING,
field: 'blog_comment_id_hash'
},
...
}
这些方法我做错了什么?
答案 0 :(得分:1)
对于Sequelize getter和setter,您需要使用以下语法:
clientStartDate:{
type: Sequelize.DATE,
allowNull: false,
validate:{
isDate: true,
isAfter: "6/24/2018"
},
get(){
this.getDataValue('clientStartDate');
},
set(date){
//set date so it's value only contains a Date and No Time
console.log("DATE: "+ date);
date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
this.setDataValue("clientStartDate",date);
}
请注意,在函数名称(即get()和set(parameter))之后如何加上括号。在setter函数中,您也不需要返回setDataValue()的值。另外,不要犯错误使用this.getDataValue('property_name')在setter函数中检索值,因为在模型调用set()函数之前尚未将原始值分配给该property_name。始终通过set()参数检索要尝试操作的值。
我还将研究在模型中使用另一种实现getter / setter方法的形式(如文档所示):
const Foo = sequelize.define('foo', {
firstname: Sequelize.STRING,
lastname: Sequelize.STRING
}, {
getterMethods: {
fullName() {
return this.firstname + ' ' + this.lastname
}
},
setterMethods: {
fullName(value) {
const names = value.split(' ');
this.setDataValue('firstname', names.slice(0, -1).join(' '));
this.setDataValue('lastname', names.slice(-1).join(' '));
},
}
});