Использование динамических параметров поиска с помощью Sequelize.js
Я пытаюсь выполнить учебник Sequelize на своем веб-сайте.
Я достиг следующей строки кода.
Project.findAll({where: ["id > ?", 25]}).success(function(projects) {
// projects will be an array of Projects having a greater id than 25
})
Если я немного подкорректирую его следующим образом
Project.findAll({where: ["title like '%awe%'"]}).success(function(projects) {
for (var i=0; i<projects.length; i++) {
console.log(projects[i].title + " " + projects[i].description);
}
});
все работает нормально. Однако, когда я пытаюсь сделать динамический параметр поиска следующим образом
Project.findAll({where: ["title like '%?%'", 'awe']}).success(function(projects) {
for (var i=0; i<projects.length; i++) {
console.log(projects[i].title + " " + projects[i].description);
}
});
Он больше не возвращает никаких результатов. Как я могу это исправить?
Ответы
Ответ 1
Я думаю, вы бы сделали это так:
where: ["title like ?", '%' + 'awe' + '%']
Итак, если бы вы делали это с реальной переменной, вы бы использовали:
Project.findAll({where: ["title like ?", '%' + x + '%']}).success(function(projects) {
for (var i=0; i<projects.length; i++) {
console.log(projects[i].title + " " + projects[i].description);
}
});
Ответ 2
Теперь на Sequelize вы можете попробовать это
{ where: { columnName: { $like: '%awe%' } } }
См. Http://docs.sequelizejs.com/en/latest/docs/querying/#operators для получения обновленного синтаксиса.
Ответ 3
Я бы сделал это следующим образом:
Project.findAll({where: {title: {like: '%' + x + '%'}, id: {gt: 10}}).success(function(projects) {
for (var i=0; i<projects.length; i++) {
console.log(projects[i].title + " " + projects[i].description);
}
});
Таким образом, у вас может быть намного больше WHERE clausas
Ответ 4
Пожалуйста, попробуйте этот код
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
{ where: { columnName: { [Op.like]: '%awe%' } } }
Ответ 5
Возможно, было бы проще использовать функцию Sequelize.Utils.format
Ответ 6
Принятый ответ ["columnName like?", '%' + x + '%']
для предложения where приводит к этой ошибке в Sequelize 4.41.1:" Поддержка литеральных замен в объекте where
была удалена ".
Предполагается: modelName.findAll({ where: { columnName: { searchCriteria } } });
Использование [Op.like]: '%awe%'
или $like: '%awe%' }
в качестве searchCriteria (где "awe" - это значение, которое вы хотите найти в columnName) приводит к SQL с предложением LIKE '\"%awe%\"'
. Обратите внимание на дополнительные кавычки. [Op.like] и $ like являются псевдонимами друг друга и не отвечают на вопрос OP, поскольку они не допускают параметры динамического поиска.
Использование [Op.like]: '%${parameter}%'
в качестве критерия поиска (где "параметр" - это параметр, значение которого вы хотите найти в columnName) привело к SQL с предложением LIKE из LIKE '\"%findMe\"'
, когда параметр = 'FindMe. Опять же, обратите внимание на дополнительные кавычки. Нет результатов.
В ответе в fooobar.com/info/15208658/... предложено использовать [Op.like]: ['%${parameter}%']
для searchCriteria (где 'parameter' - это параметр, значение которого вы хотите найти в columnName). Обратите внимание на квадратные скобки! Это привело к SQL с предложением LIKE '[\"%findMe%\"]'
когда параметр = 'findMe'. Снова обратите внимание на дополнительные кавычки и квадратные скобки. Нет результатов.
Для меня решение было использовать необработанный запрос: Sequelize.query('SELECT * FROM tableName WHERE columnName LIKE "%searchCriteria%"');