Wasserlinie finde Modell wo RegExp
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.
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)
}
})