Я пытаюсь сделать запрос с Sequelize с условным WHERE, как описано здесь (Как выполнить поиск с условными параметрами where с помощью 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 добавляет И вместо ИЛИ, например:
SELECT 'id_', 'nome', 'username', 'id' FROM 'User' AS 'User' WHERE (('User'.'nome' LIKE '%test%' AND 'User'.'username' LIKE '%test%'))
Я делаю что-то не так, чего не вижу? Я уже пробовал несколько комбинаций этого, и ни одна не работает.
Что-то не так в построенном search
фильтре. [Op.or]
должен быть разбросом поиска, а не массивом.
Попробуйте, как показано ниже,
model.User.findAll({
where: {
[Op.or]: {
email: {
[Op.like]: 'abcd',
},
username: {
[Op.like]: 'cdf',
},
}
},
logging: console.info,
});
вы получите ниже,
SELECT "id", "name", "username" FROM "users" AS "User" WHERE "User"."deleted_at" IS NULL AND ("User"."email" LIKE 'abcd' OR "User"."username" LIKE 'cdf');
Распределите объект поиска внутри ключа where. Я упомянул об этом в ответе.
Теперь вижу, спасибо. Не обратил внимания на значение скобок. Странно, не пришлось распространять переменную, просто поменял на where: {[Op.or]: search }
и заработало.
Да, это сработает, поскольку поиск — это просто динамически создаваемый объект.
попробуй использовать спред
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
})
Это имеет смысл, но я получаю тот же результат. Если я уберу фигурные скобки, я получу search is not iterable
Это не сработает. Или оператор не принимает массив.
@anoop docs.sequelizejs.com/manual/querying.html#operators, как видите, вы можете использовать массив.
@kkangil да, ты прав, он принимает. Я думал, что комбинации не поддерживаются в массивах, но похоже, что это так. github.com/sequelize/sequelize/blob/v4/docs/…. Хорошая находка.
@anoop да, я так и сказал. Я использую его много раз. но мне интересно, почему возникает ошибка, приведенная выше код.
@kkangil Я думаю, что не использую плагины для распространения объектов для транспирации
Отредактированный код работал отлично. Как я прокомментировал другой ответ, единственной проблемой с моим кодом были скобки.
Вот код, который я использую:
return Models.job.findAndCountAll({
raw: true,
where: {
isActive: 1,
...((args.statusOfJob > 0) && {
status: args.statusOfJob
})
}
})
В этом случае statusOfJob
— это числовое значение, используемое в объекте выбора, где 0 будет отображать все элементы.
Это немного загадочно, но также лаконично и снижает потребность в посторонних условных операторах и присваиваниях.
Да, я пробовал это раньше, и это работает, но мне это не подходит, потому что я хочу, чтобы предложение
WHERE
создавалось динамически.