【发布时间】:2020-09-08 21:32:28
【问题描述】:
早上好。
我对 NodeJS / sequelize world 还是很陌生,目前在尝试在屏幕上显示仪表板时遇到问题。
此仪表板具有三个过滤器:两个日期(期间)、客户姓名和员工姓名。用户可以选择无、一、二或所有过滤器,我的数据库需要相应地工作。
话虽如此,我的问题在于 Sequelize,因为我不知道如何处理参数不“始终”存在的问题。
我看过这个问题:
Sequelize optional where clause parameters?
但是这个答案不再起作用了。我还尝试了另一种构建 where 子句的方法,但我也失败了(主要是由于 sequelize 运算符)。 我尝试的最后一件事是进行包含所有参数的单个查询,但尝试找到一些值(或标志),这将使 sequelize 忽略参数,对于不存在参数的情况*,但看起来 Sequelize 没有没有类似的东西。
* 我在这里读过一个问题,其中的答案说{} 可以解决问题,但我也尝试过,但没有奏效。
总而言之:我需要做一个可以随时间“改变”的查询,例如:
Foo.findAll({
where: {
id : 1,
}
});
Foo.findAll({
where: {
id {
[Op.in] : [1,2,3,4,5]
},
name: "palmeiira",
}
});
你知道一种不需要使用大量 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;
}
我将返回值设置为一个常量:
const query = await test()
并尝试了console.log(query)
结果是:{ [Symbol(and)]: [ { id: [Object] } ] },这让我相信问题出在解析Op 部分所以我尝试使用@987654328 @ 和 'Op.in' 来避免这种情况,它解决了这个问题,但导致另一个关于 sequelize 说 Invalid value
你知道我的错误在哪里吗?
P.S.:@Anatoly 非常好的主意,你给了我原始答案。非常感谢。
【问题讨论】:
-
四个
if就够了吗? -
@Anatoly 我认为这还不够。对于这种特定情况,我想我至少需要 4 个! = 24
if的。我相信与其使用if的添加(因为我不能在Sequelize 的where 中使用),在这种情况下,每个ìf应该对应于可以在请求中发送的参数组合,例如: 1. 开始日期和客户姓名 2. 日期和客户姓名 3. 客户姓名和员工姓名......等等。 -
好的,我会尝试在答案中显示解决方案
-
Ypu 不能仅对 Op.or 和 Op.and 使用 Op.eq 数组
-
非常感谢@Anatoly。有了这个新的细节,您的解决方案工作得很好。不过,如果可能的话,我想问你另一件事。你知道只有 Op.or 和 Op.and 被接受的原因吗?再次,非常感谢。
标签: node.js postgresql sequelize.js