我有一些看起来像这样的数据:
let wheredata = [ { "field": { "field": "email", "datatype": "STRING", "inputtype": "text", "model": "User" }, "operator": "Op.eq", "value": "myuser@gmail.com" }, { "field": { "field": "createdAt", "datatype": "DATE", "inputtype": "date", "model": "User" }, "operator": "Op.gt", "value": "2015-12-12" } ]
我实际上是在使用此数据构建一个动态的sequelize查询where子句,它应该如下图所示:
{
email: {[Op.eq]: 'myuser@gmail.com'},
createdAt: {[Op.gt]: '2015-12-12'}
}
这是我执行此操作的代码:
let key, key1, obj, val;
wheredata.forEach(filter => {
key = filter.field.field;
key1 = filter.operator;
if (filter.field.field.datatype === 'INTEGER') {
val = parseInt(filter.value);
} else {
val = filter.value;
}
obj = {
[key1]: val
};
whereuser[key] = obj;
});
console.log(whereuser);
但是我的答案如下:
{
email: { 'Op.eq': 'myuser@gmail.com' },
createdAt: { 'Op.gt': '2015-12-12' }
}
通知操作员。它们实际上应该像[Op.eq]和[Op.gt],但在我的脚本中,它们分别是'Op.eq'和'Op.gt'。
我不了解如何以正确的格式获取这些运算符。
为进一步说明,我的正确执行的节点/序列化查询如下所示,其中User是序列化模型。如您所见,我正在尝试动态生成where子句。
User.findAll({
where: {
email: {[Op.eq]: 'myuser@gmail.com'},
createdAt: {[Op.gt]: '2015-12-12'}
}
})
答案 0 :(得分:5)
Op
是现有对象(根据文档,Sequelize.Op
),您需要将"Op.eq"
字符串变成eq
,因此可以使用方括号表示法制作一个表达式[Op[prop]]
,其结果为[Op.eq]
:
wheredata.forEach(filter => {
const key = filter.field.field;
const val = key.datatype === 'INTEGER'
? parseInt(filter.value)
: filter.value;
const { operator } = filter;
const operatorProp = operator.split('.')[1];
const obj = {
[Op[operatorProp]]: val
};
whereuser[key] = obj;
});
答案 1 :(得分:1)
根据我的理解,您只想将它们包装在方括号中即可,您可以这样做:
obj = {
[`[${key1}]`]: val
};
答案 2 :(得分:0)
您的运算符必须来自Sequelize
模块,并且不能直接解释为字符串。
因此,在您的代码中使用的不是[key1]
,而是考虑到Op[key1.split('.')[1]]
的{{1}}。
如果要使它更整洁,请创建一个使用运算符并返回要用作键的值的函数,进入Sequelize对象,如:
const Op = Sequelize.Op;
const Sequelize = {
Op: {
gt: 'gt',
};
};
function (operator) {
const split = operator.split('.');
return split.reduce((tmp, x) => tmp[x], Sequelize);
}