Question

J'essaie de créer une fonction de recherche simple dans SailsJS (bêta), en utilisant l'ORM waterline pour la gestion des données.Ma fonction dans mon contrôleur effectue la recherche en utilisant la méthode prédéfinie find() de la ligne de flottaison.

Je me demande, est-il possible d'envoyer un modèle d'expression rationnelle SQL à la fonction waterline find() pour lui permettre de récupérer tous les utilisateurs ayant une REGEXP correspondante ?

Ma méthode de recherche dans mon contrôleur contient ceci (sauf la fonctionnalité regexp, que je demande) :

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

  });

Le fullName L'attribut est défini comme une méthode d'instance dans les attributs et n'est probablement pas consultable.Cependant, existe-t-il un moyen de faire une recherche décente de noms ?

Ceci est un extrait de mon modèle utilisateur :

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

Comment puis-je faire le find()-la méthode fonctionne-t-elle avec les expressions régulières SQL ?Mon objectif est de faire une recherche sur "Hans Eikerol" pour afficher "Hans Martin Eikerol" dans le jeu de résultats.

Était-ce utile?

La solution

Cartes de flottaison .find() au sous-jacent find syntaxe de la base de données à laquelle vous êtes connecté.Il ne prend pas en charge les expressions régulières car les expressions régulières ne sont pas prises en charge par tous les adaptateurs de base de données.On pourrait affirmer que, puisque la recherche par expressions régulières est fournie en standard avec la plupart des bases de données grand public de nos jours, cette fonctionnalité pourrait avoir sa place dans Waterline, mais en attendant, vous pouvez utiliser .query pour faire une requête SQL native.Ensuite, vous forcez les résultats aux modèles Waterline.Par exemple, avec 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);});
    });
});

Autres conseils

Auteur Modifier :

Merci pour la réponse :) Cependant, j'ai réussi à trouver une solution adaptée à mon problème sans avoir à utiliser la recherche de modèles d'expressions régulières.Voici ma nouvelle méthode de contrôleur :

  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)
      }
    })
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top