Pregunta

Estoy intentando crear una función de búsqueda simple en SailsJS (beta), usando el ORM de línea de agua para el manejo de datos.Mi función en mi controlador realiza la búsqueda utilizando el método predefinido find() de línea de flotación.

Me pregunto, ¿es posible enviar un patrón SQL-regexp a la función find() de la línea de agua para que busque a todos los usuarios que tengan una REGEXP coincidente?

Mi método de búsqueda en mi controlador contiene esto (excepto la funcionalidad regexp, que estoy solicitando):

// Replace any spaces with SQL regex wildcards
var regexp = req.body.search.replace(' ', '*');

  // Show found users
  User.find()
  .where({
    or: [
      {username: { contains: req.body.search }},
      {email: { contains: req.body.search }},
      {fullName: { regexp: regexp }}
    ]
  }).exec(function(err, users){

    if (err){
       return res.send(403, 'Failed to find users' + JSON.stringify(err));
    }

    res.view('userlist', {
      users: users
    });

  });

El fullName El atributo se define como un método de instancia dentro de los atributos y probablemente no se pueda buscar.Sin embargo, ¿hay alguna manera de realizar una búsqueda decente de nombres?

Este es un extracto de mi modelo de usuario:

module.exports = {
  attributes: {
    firstName: {
      type: 'string'
    },
    lastName: {
      type: 'string'
    },
    fullName: function(){
      return this.firstName + ' ' + this.lastName;
    },
    (...some more attributes, as well as email and username...)
  }
}

¿Cómo hago el find()-¿Método de trabajo con expresiones regulares SQL?Mi objetivo es realizar una búsqueda de "Hans Eikerol" y mostrar "Hans Martin Eikerol" en el conjunto de resultados.

¿Fue útil?

Solución

Mapas de línea de flotación .find() al subyacente find sintaxis de la base de datos a la que está conectado.No admite expresiones regulares porque no todos los adaptadores de bases de datos admiten expresiones regulares.Se podría argumentar que, dado que la búsqueda de expresiones regulares es estándar en la mayoría de las bases de datos convencionales en estos días, la función podría tener un lugar en Waterline, pero mientras tanto puedes usar .query para hacer una consulta SQL nativa.Luego obligas a los resultados a volver a los modelos Waterline.Por ejemplo, con sails-mysql:

User.query("[some sql query using RLIKE]", function(err, rows) {
    if (err){
        return res.send(403, 'Failed to find users' + JSON.stringify(err));
    }

    res.view('userlist', {
        // Map the rows returned by the query to Waterline instances
        users: rows.map(function(row){return new User._model(row);});
    });
});

Otros consejos

Edición del autor:

Gracias por la respuesta :) Sin embargo, logré encontrar una solución adecuada a mi problema sin tener que utilizar la búsqueda de patrones de expresiones regulares.Este es mi nuevo método de controlador:

  var split = req.body.search.split(' ');

  // Assume last piece of search is the lastName, ignore middlenames
  var firstName = split[0];
  var lastName = split.pop();

  // Show found users
  User.find()
  .where({
    or: [
      {username: { contains: req.body.search }},
      {email: { contains: req.body.search }},
      {firstName: { contains: firstName }},
      {lastName: { contains: lastName }},
      {firstName: {startsWith: firstName}, lastName: lastName}
    ]
  }).exec(function(err, users){

    if (err){
       return res.send(403, 'Failed to find users' + JSON.stringify(err));
    }

    res.view('admin/users', {
      users: users
    });

  });
thanks a lot for your answer, I have implemented something like this, using waterline on sails:
.find({  $and:[{"userType":"basic"},{"name":{contains:req.params.name}} ] })
    .exec(function(err,seller){
      if(err){
        res.send(err);
      }else{
        console.log(seller);
        res.send(seller)
      }
    })
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top