我试图在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);});
    });
});

07-28 09:30