Domanda

Sto cercando di creare una semplice funzione di ricerca in Sailsjs (beta), utilizzando la linea di galleggiamento ORM per la gestione dei dati.La mia funzione nel mio controller esegue la ricerca utilizzando il metodo di rete predefinito () - Metodo di galleggiamento.

Mi chiedo, è possibile inviare un motivo SQL-Regexp alla linea di galleggiamento Trova () - Funzione per far funzionare tutti gli utenti con un regexp corrispondente?

Il mio metodo di ricerca nel mio controller contiene questo (tranne la funzionalità di regexp, che sto chiedendo):

// 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
    });

  });
.

L'attributo fullName è definito come metodo di istanza all'interno degli attributi, e probabilmente non è ricercabile.Tuttavia, c'è un modo per creare una ricerca decente per i nomi?

Questo è un estratto dal mio modello utente:

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...)
  }
}
.

Come faccio a fare il metodo-metodo find() con SQL Regex?Il mio obiettivo è effettuare una ricerca di "Hans Eikerol" Display "Hans Martin Eikerol" nel set di risultati.

È stato utile?

Soluzione

Waterline Maps .find() alla sintassi del find sottostante per il database a cui sei connesso.Non supporta le espressioni regolari perché il regex non è supportato da tutti gli adattatori del database.Si potrebbe discutere che poiché la ricerca di espressioni regolari viene fornita di serie con la maggior parte dei database mainstream in questi giorni, che la funzione potrebbe avere un posto in linea di galleggiamento, ma nel frattempo è possibile utilizzare .query per eseguire una query SQL nativa.Quindi tu costringe i risultati ai modelli di galleggiamento.Ad esempio, 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);});
    });
});
.

Altri suggerimenti

Autore Modifica:

Grazie per la risposta :) Tuttavia, sono riuscito a trovare una soluzione adatta al mio problema senza dover utilizzare la ricerca del modello di regex.Questo è il mio nuovo metodo del controller:

  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)
      }
    })
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top