En utilisant les paramètres de recherche dynamiques avec Sequelize.js
-
26-10-2019 - |
Question
Je suis en train de suivre le Sequelize tutoriel sur leur site .
J'ai atteint la ligne de code ci-dessous.
Project.findAll({where: ["id > ?", 25]}).success(function(projects) {
// projects will be an array of Projects having a greater id than 25
})
Si je Tweak suit légèrement
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);
}
});
tout fonctionne très bien. Cependant, lorsque je tente de rendre la dynamique des paramètres de recherche comme suit
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);
}
});
Il ne renvoie aucun résultat. Comment puis-je résoudre ce problème?
La solution
Je pense que vous le faire comme ceci:
where: ["title like ?", '%' + 'awe' + '%']
Donc, si vous faites cela avec une variable réelle vous pouvez utiliser:
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);
}
});
Autres conseils
sur Sequelize vous pouvez essayer
{ where: { columnName: { $like: '%awe%' } } }
Voir http://docs.sequelizejs.com/en/latest/ docs / # / opérateurs interrogation pour la syntaxe mise à jour
Je le ferais de cette façon:
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);
}
});
De cette façon, vous pouvez avoir bien plus d'où clausas
S'il vous plaît essayer ce code
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
{ where: { columnName: { [Op.like]: '%awe%' } } }
Il pourrait être plus propre à effet de levier de la fonction Sequelize.Utils.format
La réponse acceptée de ["columnName like ?", '%' + x + '%']
pour la clause où les résultats de cette erreur dans Sequelize 4.41.1: «Soutien pour le remplacement littéral dans l'objet where
a été supprimé »
En supposant: modelName.findAll({ where : { columnName : { searchCriteria } } });
Utilisation [Op.like]: '%awe%'
ou $like: '%awe%' }
comme critèreRech (où « la crainte » est la valeur que vous voulez trouver dans columnName) à la fois dans SQL avec résultat une clause LIKE de LIKE '\"%awe%\"'
. Notez les guillemets supplémentaires. [Op.like] et $ sont des alias comme de l'autre et ni répondre à la question de l'OP parce qu'ils ne permettent pas de paramètres de recherche dynamique.
Utilisation [Op.like] : `%${parameter}%`
comme critèreRech (où « paramètre » est le paramètre dont la valeur que vous voulez trouver dans columnName) a donné lieu à SQL avec une clause LIKE de LIKE '\"%findMe\"'
lorsque le paramètre = « findme ». Encore une fois, notez les guillemets supplémentaires. Aucun résultat.
Une réponse un autre poste StackOverflow a suggéré d'utiliser [Op.like]: [`%${parameter}%`]
pour le critèreRech (où « paramètre » est le paramètre dont la valeur que vous voulez trouver dans columnName). Remarquez les crochets! Cela a donné lieu à SQL avec une clause LIKE de LIKE '[\"%findMe%\"]'
lorsque le paramètre = 'findme'. Encore une fois remarquer les guillemets supplémentaires et les crochets. Aucun résultat.
Pour moi, la solution était d'utiliser une requête brute:
Sequelize.query('SELECT * FROM tableName WHERE columnName LIKE "%searchCriteria%"');