Verwenden dynamischer Suchparameter mit sequelize.js
-
26-10-2019 - |
Frage
Ich versuche dem zu folgen Folgen Sie das Tutorial auf ihrer Website Folgenu.
Ich habe die folgende Codezeile erreicht.
Project.findAll({where: ["id > ?", 25]}).success(function(projects) {
// projects will be an array of Projects having a greater id than 25
})
Wenn ich es leicht wie folgt optimiere
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);
}
});
Alles funktioniert gut. Wenn ich jedoch versuche, den Suchparameter wie folgt dynamisch zu machen
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);
}
});
Es gibt keine Ergebnisse mehr zurück. Wie kann ich das beheben?
Lösung
Ich denke, Sie würden das so machen:
where: ["title like ?", '%' + 'awe' + '%']
Wenn Sie dies also mit einer tatsächlichen Variablen tun würden, die Sie verwenden würden:
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);
}
});
Andere Tipps
Jetzt können Sie dies ausprobieren
{ where: { columnName: { $like: '%awe%' } } }
Sehen http://docs.sequelizejs.com/en/latest/docs/querying/#operators Für aktualisierte Syntax
Ich würde es auf diese Weise tun:
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);
}
});
Auf diese Weise können Sie gut mehr dort haben, wo Clausas
Bitte probieren Sie diesen Code aus
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
{ where: { columnName: { [Op.like]: '%awe%' } } }
Es könnte sauberer sein, die Funktion der fequelize.utils.Format zu nutzen
Die akzeptierte Antwort von ["columnName like ?", '%' + x + '%']
Für die WHERE -Klausel führt zu diesem Fehler in der Folge 4.41.1: "Unterstützung für den wörtlichen Ersatz in der where
Objekt wurde entfernt. "
Annahme: modelName.findAll({ where : { columnName : { searchCriteria } } });
Verwendung [Op.like]: '%awe%'
oder $like: '%awe%' }
Da die Suche der Suche (wo 'Ehrfurcht' der Wert ist, den Sie in Spaltenname finden möchten) führen beide zu SQL mit einer ähnlichen Klausel von LIKE '\"%awe%\"'
. Beachten Sie die zusätzlichen Anführungszeichen. [Op.like] und $ wie sind Aliase voneinander und beantworten weder die Frage des OP, da sie keine dynamischen Suchparameter zulassen.
Verwendung [Op.like] : `%${parameter}%`
Da die Suchkriterie (wobei 'Parameter' der Parameter ist, dessen Wert Sie in ColumnName finden möchten) führte zu SQL mit einer ähnlichen Klausel von LIKE '\"%findMe\"'
wenn parameter = 'findMe'. Beachten Sie erneut die zusätzlichen Anführungszeichen. Keine Ergebnisse.
Eine Antwort in Ein weiterer Stackoverflow -Beitrag Vorgeschlagene Verwendung [Op.like]: [`%${parameter}%`]
Für die Suche nach SearchCriteria (wobei 'Parameter' der Parameter ist, dessen Wert Sie in ColumnName finden möchten). Beachten Sie die Quadratklammern! Dies führte zu SQL mit einer ähnlichen Klausel von LIKE '[\"%findMe%\"]'
wenn parameter = 'findMe'. Beachten Sie erneut die zusätzlichen Anführungszeichen und die Quadratklammern. Keine Ergebnisse.
Für mich bestand die Lösung darin, eine rohe Abfrage zu verwenden:Sequelize.query('SELECT * FROM tableName WHERE columnName LIKE "%searchCriteria%"');