質問
データ処理のためにウォーターラインORMを使用して、SailsJS(Beta)に単純な検索機能を作成しようとしています。私のコントローラーの私の関数は、事前定義されたfind() - ウォーターラインの方法を使用して検索を行います。
私は疑問に思うのは、SQL-RegexpパターンをWaterline find()に送信することが可能です。
マイコントローラのMy Find-Methodには、これが含まれています(尋ねているRegexp機能を除く):
// 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
});
});
.
fullName
属性は、属性内のインスタンスメソッドとして定義されており、おそらく検索できません。しかし、名前をまともな検索をする方法はありますか?
これは私のユーザーモデルからの抽出です:
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...)
}
}
.
SQL Regexを使用してfind()
-Methodを作業する方法私の目標は、結果セットの "HANS MARTIN EIKEROL"を "HANS MARTIN EIKEROL"を検索することです。
解決
Waterline接続しているデータベースの基礎となる.find()
構文にfind
をマッピングします。Regexはすべてのデータベースアダプタでサポートされていないため、正規表現はサポートされていません。正規表現検索は最近のほとんどの主流データベースと標準であるため、この機能にウォーターライン内の場所がある可能性があると主張することはできますが、その間に.query
を使用してネイティブのSQLクエリを実行できます。その後、結果をウォーターラインモデルに強制します。たとえば、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);});
});
});
. 他のヒント
著者編集:
答えをありがとう:)しかし、私は正規表現パターン検索を使用する必要なしに私の問題に対する適切な解決策を見つけることができました。これは私の新しいコントローラ方法です:
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)
}
})
.