Uso de parámetros de búsqueda dinámica con SECLELIZE.JS
-
26-10-2019 - |
Pregunta
Estoy tratando de seguir el Secuestrar tutorial en su sitio web.
He llegado a la siguiente línea de código.
Project.findAll({where: ["id > ?", 25]}).success(function(projects) {
// projects will be an array of Projects having a greater id than 25
})
Si lo ajusto un poco como sigue
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);
}
});
Todo funciona bien. Sin embargo, cuando intento hacer la dinámica del parámetro de búsqueda de la siguiente manera
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);
}
});
Ya no devuelve ningún resultado. ¿Cómo puedo arreglar esto?
Solución
Creo que harías eso así:
where: ["title like ?", '%' + 'awe' + '%']
Entonces, si estuviera haciendo esto con una variable real, usaría:
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);
}
});
Otros consejos
Ahora en SECLEZIZE PUEDES PROBAR ESTO
{ where: { columnName: { $like: '%awe%' } } }
Ver http://docs.sequelizejs.com/en/latest/docs/querying/#operators Para sintaxis actualizada
Lo haría de esta manera:
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 esta manera puedes tener muy bien donde Clausas
Prueba este código
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
{ where: { columnName: { [Op.like]: '%awe%' } } }
Puede ser más limpio aprovechar la función de secuelas.utilss.format
La respuesta aceptada de ["columnName like ?", '%' + x + '%']
Para la cláusula WHERE da como resultado este error en SECLELIZE 4.41.1: "Soporte para reemplazos literales en el where
El objeto ha sido eliminado ".
Asumiendo: modelName.findAll({ where : { columnName : { searchCriteria } } });
Usando [Op.like]: '%awe%'
o $like: '%awe%' }
Como el SearchCriteria (donde 'Awe' es el valor que desea encontrar en ColumnName), ambos dan como resultado SQL con una cláusula similar de LIKE '\"%awe%\"'
. Observe las comillas adicionales. [OP. Like] y $ Like son alias el uno del otro y ninguno de los dos responde a la pregunta del OP porque no permiten parámetros de búsqueda dinámicos.
Usando [Op.like] : `%${parameter}%`
Como el SearchCriteria (donde 'Parámetro' es el parámetro cuyo valor desea encontrar en ColumnName) dio como resultado SQL con una cláusula similar de LIKE '\"%findMe\"'
Cuando parámetro = 'findme'. Nuevamente, observe las comillas adicionales. No hay resultados.
Una respuesta en Otra publicación de Stackoverflow sugerido usando [Op.like]: [`%${parameter}%`]
Para el SearchCriteria (donde 'Parámetro' es el parámetro cuyo valor desea encontrar en ColumnName). ¡Observe los soportes cuadrados! Esto resultó en SQL con una cláusula similar de LIKE '[\"%findMe%\"]'
Cuando parámetro = 'findme'. Nuevamente observe las comillas adicionales y los soportes cuadrados. No hay resultados.
Para mí, la solución era usar una consulta sin procesar:Sequelize.query('SELECT * FROM tableName WHERE columnName LIKE "%searchCriteria%"');