我有一个动态filter
方法,它传递需要用来过滤Sequelize
查询的属性。例如,我可能想要按某个价格范围和生产日期过滤Cars
列表。生成如下所示的客户端查询:
const response = await this.get('cars', {
price: {
gt: 80000
lt: 1200000
},
year: 2019
})
查询参数将被序列化,发送到我的服务器,然后解码回对象形式。在这个查询中,我需要使用Sequelize的[Op.gt]
和[Op.lt]
符号,因为我需要按价格范围过滤。如何动态地将我的对象转换为如下所示:
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对象,因为这个filter参数是动态的,谢谢!
发布于 2019-09-30 21:49:23
至少在您的简单示例中,json-transormer-node可以完成这项工作。
首先,确保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})
生成的查询应该包含WHERE price > 8000 AND price < 12000
。注意:如果你有一个复杂的过滤器,这可能会很麻烦…
https://stackoverflow.com/questions/58156930
复制相似问题