续集查询的可选参数

pal*_*ira 3 postgresql node.js sequelize.js

早上好。

我对 NodeJS/sequelize 世界相当陌生,目前在尝试在屏幕上显示仪表板时遇到问题。

该仪表板具有三个过滤器:两个日期(期间)、客户姓名和员工姓名。用户可以选择无、一个、两个或所有过滤器,我的数据库需要相应地工作。

话虽这么说,我的问题是 Sequelize,因为我不知道如何处理参数不“总是”存在的问题。

我见过这个问题:

序列化可选的 where 子句参数?

但这个答案不再起作用了。我还尝试了另一种构建 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,你给我的原始答案非常好。非常感谢。

Ana*_*oly 5

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