一尘不染

如何使用Sequelize在带条件的where参数中执行搜索

sql

通常,每当我为SQL编写搜索查询时,我都会执行以下操作:

SELECT * FROM users u
WHERE (@username IS NULL OR u.username like '%' + @username + '%')
AND (@id IS NULL OR u.id = @id)

基本上,这模拟了条件WHERE子句。如果提供了@searchParam,我们只想将@searchParam与该列进行比较。

有没有办法使用Sequelize复制此内容?

编辑: 这是我的最佳尝试,但失败了:

models.user.findAll({
  where: {
    username: searchParams.username || models.sequelize.col('user.username'),
    id: searchParams.id || models.sequelize.col('user.id')
  }
})

更新: 我找到了一种方法,但是感觉像是一种解决方法。我敢肯定,必须有一种更优雅的方式。这可行,但是很丑陋:

models.user.findAll({
  where: [
    '(? IS NULL OR "user"."username" LIKE ?) AND (? IS NULL OR "user"."id" = ?)',
    searchParams.username,
    `%${searchParams.username}%`,
    searchParams.id,
    searchParams.id
  ]
})

阅读 352

收藏
2021-05-23

共1个答案

一尘不染

您可以准备具有所需条件的对象。简单易懂

var whereStatement = {};
if(searchParams.id)
    whereStatement.id = searchParams.id;
if(searchParams.username)
    whereStatement.username = {$like: '%' + searchParams.username + '%'};
models.user.findAll({
  where: whereStatement
});
2021-05-23