如何将动态查询参数对象转换为Sequelize运算符(Javascript符号)
我有一个动态的如何将动态查询参数对象转换为Sequelize运算符(Javascript符号),javascript,sequelize.js,Javascript,Sequelize.js,我有一个动态的filter方法,它通过我需要用来过滤我的Sequelize查询的属性。例如,我可能想按特定的价格范围和生产日期过滤汽车的列表。生成如下所示的客户端查询: const response = await this.get('cars', { price: { gt: 80000 lt: 1200000 }, year: 2019 }) const Op = require('sequelize').Op; const whe
filter
方法,它通过我需要用来过滤我的Sequelize
查询的属性。例如,我可能想按特定的价格范围和生产日期过滤汽车的列表。生成如下所示的客户端查询:
const response = await this.get('cars', {
price: {
gt: 80000
lt: 1200000
},
year: 2019
})
const Op = require('sequelize').Op;
const whereParams = {
price: {
[Op.gt]: 80000,
[Op.lt]: 120000
},
year: 2019
}
查询参数将被序列化,发送到我的服务器,然后解码回对象形式。在这个查询中,我需要使用Sequelize的[Op.gt]
和[Op.lt]
符号,因为我需要按价格范围进行筛选。如何动态地将对象转换为如下所示:
const response = await this.get('cars', {
price: {
gt: 80000
lt: 1200000
},
year: 2019
})
const Op = require('sequelize').Op;
const whereParams = {
price: {
[Op.gt]: 80000,
[Op.lt]: 120000
},
year: 2019
}
这样我就可以在我的where
属性中使用它们:
router.get('cars', (req, res) => {
Car.findAll({
where: whereParams
}).then((cars) => {
res.status(200).send(cars);
})
})
我不能简单地硬编码Sequelize对象,因为这个过滤器参数是动态的,谢谢 至少对于您的简单示例,您可以完成这项工作
首先,确保Sequelize对象具有操作符别名:
...
dialect: 'mysql',
operatorsAliases: { $lt: Op.lt, $gt: Op.gt},
define: {
...
然后,设置一个转换:
const nodeJsonTransformer = require('json-transformer-node');
var carFilter = {
price: {
gt: 80000
lt: 1200000
}
}
var transformation = {
mapping : {
item : {
price : {
$gt : 'price.gt',
$lt : 'price.lt'
}
}
}
};
var whereValues = nodeJsonTransformer.transform(carFilter, transformation);
Car.findAll( {where: whereValues})
生成的查询应包括其中price>8000和price<12000
。警告:如果你有一个复杂的过滤器,这可能会很麻烦