Использование динамических параметров поиска с помощью 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);
    }
});

Ответ 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%"');