pal*_*ira 3 postgresql node.js sequelize.js
早上好。
我对 NodeJS/sequelize 世界相当陌生,目前在尝试在屏幕上显示仪表板时遇到问题。
该仪表板具有三个过滤器:两个日期(期间)、客户姓名和员工姓名。用户可以选择无、一个、两个或所有过滤器,我的数据库需要相应地工作。
话虽这么说,我的问题是 Sequelize,因为我不知道如何处理参数不“总是”存在的问题。
我见过这个问题:
但这个答案不再起作用了。我还尝试了另一种构建 where 子句的方法,但也失败了(主要是由于续集运算符)。我尝试的最后一件事是进行包含所有参数的单个查询,但尝试找到一些值(或标志),这将使sequelize忽略参数,对于参数不存在的情况*,但看起来Sequelize没有没有那样的东西。
* 我在这里读过一个问题,有一个答案说{}可以解决这个问题,但我也尝试过,但没有成功。
总之:我需要进行一个可以随着时间“改变”的查询,例如:
Foo.findAll({
where: {
id : 1,
}
});
Foo.findAll({
where: {
id {
[Op.in] : [1,2,3,4,5]
},
name: "palmeiira",
}
});
Run Code Online (Sandbox Code Playgroud)
您知道一种不需要使用大量 if / switch 语句的方法吗?
我目前正在使用 Sequelize v. 5.5.1。
更新
我尝试按照@Anatoly 的建议进行操作,并创建了一个函数来构建参数。就是这样的。(我尝试了一个“较小”版本只是为了测试)
async function test() {
const where = {};
where[Op.and] = [];
where[Op.eq].push({
id: {
[Op.in]: [1,2,3]
}
});
return where;
}
Run Code Online (Sandbox Code Playgroud)
我将返回值设置为 const:
const query = await test()
Run Code Online (Sandbox Code Playgroud)
并尝试的console.log(query)
结果是:{ [Symbol(and)]: [ { id: [Object] } ] },这让我相信问题出在解析该Op 部分,所以我尝试使用'Op.and'and'Op.in'来避免它,它解决了这个问题,但导致了续集上的另一个问题,说无效值
你知道我的错误在哪里吗?
PS:@Anatoly,你给我的原始答案非常好。非常感谢。
如果这三个条件应该一起工作,那么您可以将Op.and与一系列条件一起使用:
const where = {}
if (datesFilter || clientNameFilter || employeenameFilter) {
where[Op.and] = []
if (datesFilter) {
where[Op.and].push({
dateField: {
[Op.between]: [datesFilter.start, datesFilter.finish]
}
})
}
if (clientNameFilter) {
where[Op.and].push({
name: {
[Op.iLike]: `%${clientNameFilter.value}%`
}
})
}
if (employeenameFilter) {
where[Op.and].push({
employeeName: {
[Op.iLike]: `%${employeenameFilter.value}%`
}
})
}
}
const dashboardItems = await DashboardItem.findAll({ where }, {
// some options here
})
Run Code Online (Sandbox Code Playgroud)
如果条件可以作为替代方案,则只需将Op.and替换为Op.or
| 归档时间: |
|
| 查看次数: |
3988 次 |
| 最近记录: |