我正在尝试使用Sequelize使用条件WHERE进行查询,如此处所述(How to perform a search with conditional where parameters using Sequelize)。
我的代码的相关部分是这样的
const Op = Sequelize.Op;
var search = {};
if (typeof req.query.search !== 'undefined'){
search.nome = {[Op.like]: '%' + req.query.search + '%'};
search.username = {[Op.like]: '%' + req.query.search + '%'};
}
model.User.findAll({
where:{
[Op.or]: [
search
]
})
它可以工作,但是生成的SQL会添加AND而不是OR,如下所示:
SELECT 'id_', 'nome', 'username', 'id' FROM 'User' AS 'User' WHERE (('User'.'nome' LIKE '%test%' AND 'User'.'username' LIKE '%test%'))
我做错了什么我看不到吗? 我已经尝试过这种方法的几种组合,但都无效。
答案 0 :(得分:0)
构造的search
过滤器中有问题。 [Op.or]
应该是搜索范围,而不是数组。
尝试如下,
model.User.findAll({
where: {
[Op.or]: {
email: {
[Op.like]: 'abcd',
},
username: {
[Op.like]: 'cdf',
},
}
},
logging: console.log,
});
您将获得以下信息,
SELECT "id", "name", "username" FROM "users" AS "User" WHERE "User"."deleted_at" IS NULL AND ("User"."email" LIKE 'abcd' OR "User"."username" LIKE 'cdf');
答案 1 :(得分:0)
尝试使用点差
model.User.findAll({
where: {
[Op.or]: [
{...search}
]
}
})
这是什么?
const where = {}
if (typeof req.query.search !== 'undefined'){
where[Op.or] = {
nome : {
[Op.like] : `%${req.query.search}%`
},
username : {
[Op.like] : `%${req.query.search}%`
},
}
}
model.User.findAll({
where
})