水线找到RegExp的模型

时间:2014-06-03 14:24:06

标签: sails.js waterline

我试图在SailsJS(beta)中创建一个简单的搜索功能,使用水线ORM进行数据处理。我的控制器中的功能使用预定义的find() - 水线方法进行搜索。

我想知道,是否有可能将SQL-regexp模式发送到水线find() - 函数以使其获取具有匹配REGEXP的所有用户?

我的控制器中的find-method包含了这个(正则我要求的正则表达式功能除外):

// 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"在结果集中。

2 个答案:

答案 0 :(得分:3)

作者编辑:

感谢您的回答:)但是,我设法找到了一个合适的解决方案来解决我的问题而无需使用正则表达式模式搜索。这是我的新控制器方法:

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

  });

答案 1 :(得分:2)

水线将.find()映射到您所连接的数据库的基础find语法。它不支持正则表达式,因为所有数据库适配器都不支持正则表达式。有人可能会争辩说,由于正规表达式搜索近来成为大多数主流数据库的标准,因此该功能可能在Waterline中占有一席之地,但与此同时,您可以使用.query来执行本机SQL查询。然后你将结果强制回Waterline模型。例如,使用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);});
    });
});