【问题标题】:Optional parameters on sequelize querysequelize 查询的可选参数
【发布时间】: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


【解决方案1】:

如果这三个条件应该一起工作,那么您可以将 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
})

如果条件可以作为替代方案,那么只需将 Op.and 替换为 Op.or

【讨论】:

  • 我用我现在遇到的问题更新了问题,因为我尝试了你的解决方案。你知道是什么原因造成的吗?谢谢您的回答。 @Anatoly
猜你喜欢
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 2019-02-01
  • 2015-09-14
相关资源
最近更新 更多