通常,每当我为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 ] })
您可以准备具有所需条件的对象。简单易懂
var whereStatement = {}; if(searchParams.id) whereStatement.id = searchParams.id; if(searchParams.username) whereStatement.username = {$like: '%' + searchParams.username + '%'}; models.user.findAll({ where: whereStatement });