parametri di ricerca dinamico usando con Sequelize.js
-
26-10-2019 - |
Domanda
Sto cercando di seguire il Sequelize tutorial sul loro sito web .
Ho raggiunto la seguente riga di codice.
Project.findAll({where: ["id > ?", 25]}).success(function(projects) {
// projects will be an array of Projects having a greater id than 25
})
Se ho modificarlo un po 'come segue
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);
}
});
tutto funziona bene. Tuttavia quando provo a fare il parametro di ricerca dinamica nel modo seguente
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);
}
});
Non è più restituisce alcun risultato. Come posso risolvere questo problema?
Soluzione
Credo che l'hai fatto in questo modo:
where: ["title like ?", '%' + 'awe' + '%']
Quindi, se stavi facendo questo con una variabile reale devi usare:
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);
}
});
Altri suggerimenti
Ora sul Sequelize si può provare questo
{ where: { columnName: { $like: '%awe%' } } }
http://docs.sequelizejs.com/en/latest/ docs / interrogazione / # operatori per aggiornato sintassi
vorrei farlo in questo modo:
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);
}
});
In questo modo è possibile avere ben più DOVE clausas
Si prega di provare questo codice
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
{ where: { columnName: { [Op.like]: '%awe%' } } }
Potrebbe essere più pulito di sfruttare la funzione di Sequelize.Utils.format
La risposta accettata ["columnName like ?", '%' + x + '%']
per il quale i risultati clausola in questo errore in Sequelize 4.41.1: "Il supporto per le sostituzioni letterali nell'oggetto where
è stato rimosso"
Supponendo: modelName.findAll({ where : { columnName : { searchCriteria } } });
Utilizzando [Op.like]: '%awe%'
o $like: '%awe%' }
come il searchCriteria (dove 'timore' è il valore che si desidera trovare in columnName) sia risultato in SQL con una clausola LIKE di LIKE '\"%awe%\"'
. Notare le virgolette aggiuntive. [Op.like] e $ come sono alias l'uno dall'altro e non rispondere alla domanda del PO, perché non permettono parametri di ricerca dinamica.
Utilizzo [Op.like] : `%${parameter}%`
come il searchCriteria (dove 'parametro' è il parametro il cui valore si desidera trovare in columnName) ha comportato SQL con una clausola LIKE di LIKE '\"%findMe\"'
quando il parametro = 'findme'. Anche in questo caso, notare le virgolette aggiuntive. Nessun risultato.
Una risposta in un altro post StackOverflow ha suggerito di utilizzare [Op.like]: [`%${parameter}%`]
per il searchCriteria (dove 'parametro' è il parametro il cui valore si desidera trovare in columnName). Notate le parentesi quadre! Ciò ha provocato SQL con una clausola LIKE di LIKE '[\"%findMe%\"]'
quando il parametro = 'findme'. Anche in questo caso notare le virgolette aggiuntive e le parentesi quadre. Nessun risultato.
Per me, la soluzione era quella di utilizzare una query cruda:
Sequelize.query('SELECT * FROM tableName WHERE columnName LIKE "%searchCriteria%"');