我试图在SailsJS(测试版)中创建一个简单的搜索功能,使用水线ORM进行数据处理。我控制器中的函数使用水线的预定义find()方法进行搜索。
我想知道,是否可以向水线find()函数发送SQL-regexp模式,以使其获取具有匹配的REGEXP的所有用户?
我在控制器中的查找方法包含以下内容(除了我要的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...)
}
}
如何使
find()
方法与SQL正则表达式一起使用?我的目标是在结果集中搜索“ Hans Eikerol”显示“ Hans Martin Eikerol”。 最佳答案
水线将.find()
映射到所连接数据库的基础find
语法。它不支持正则表达式,因为并非所有数据库适配器都支持正则表达式。有人可能会说,由于正则表达式搜索已成为当今大多数主流数据库的标准配置,因此该功能可能在Waterline中占有一席之地,但是与此同时,您可以使用.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);});
});
});