Frage

Ich versuche, eine einfache Suchfunktion in SailsJS (Beta) zu erstellen, die das Wasserlinien-ORM für die Datenverarbeitung verwendet.Meine Funktion in meinem Controller führt die Suche mit der vordefinierten find() -Methode von waterline durch.

Ich frage mich, ist es möglich, ein SQL-Regexp-Muster an die waterline find () -Funktion zu senden, damit alle Benutzer mit einem passenden regulären Ausdruck abgerufen werden?

Meine Suchmethode in meinem Controller enthält dies (mit Ausnahme der regulären Ausdruck-Funktionalität, nach der ich frage):

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

  });

Der fullName attribut ist als Instanzmethode innerhalb der Attribute definiert und kann wahrscheinlich nicht durchsucht werden.Gibt es jedoch eine Möglichkeit, eine anständige Suche nach Namen durchzuführen?

Dies ist ein Auszug aus meinem Benutzermodell:

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

Wie mache ich das find()-methodenarbeit mit SQL Regex?Mein Ziel ist es, bei einer Suche nach "Hans Eikerol" "Hans Martin Eikerol" in der Ergebnismenge anzuzeigen.

War es hilfreich?

Lösung

Wasserlinienkarten .find() zum Basiswert find syntax für die Datenbank, mit der Sie verbunden sind.Reguläre Ausdrücke werden nicht unterstützt, da regulärer Ausdruck nicht von allen Datenbankadaptern unterstützt wird.Man könnte argumentieren, dass, da die Suche nach regulären Ausdrücken heutzutage bei den meisten gängigen Datenbanken Standard ist, die Funktion möglicherweise einen Platz in der Wasserlinie hat, aber in der Zwischenzeit können Sie verwenden .query um eine native SQL-Abfrage durchzuführen.Dann zwingen Sie die Ergebnisse zurück zu Wasserlinienmodellen.Zum Beispiel mit 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);});
    });
});

Andere Tipps

Autor Bearbeiten:

Danke für die Antwort :) Es ist mir jedoch gelungen, eine geeignete Lösung für mein Problem zu finden, ohne die Suche nach regulären Ausdrücken verwenden zu müssen.Dies ist meine neue Controller-Methode:

  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)
      }
    })
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top