Ватерлиния найти модель, где RegExp

Я пытаюсь создать простую функцию поиска в SailsJS (бета), используя ORM ватерлинии для обработки данных. Моя функция в моем контроллере выполняет поиск, используя предопределенный метод find() для ватерлинии.

Интересно, можно ли отправить шаблон SQL-regexp в функцию find(), чтобы она извлекала всех пользователей, имеющих соответствующий 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" в наборе результатов.


person hansmei    schedule 03.06.2014    source источник


Ответы (2)


Waterline сопоставляет .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);});
    });
});
person sgress454    schedule 03.06.2014

Редактирование автора:

Спасибо за ответ :) Однако мне удалось найти подходящее решение моей проблемы без использования поиска по шаблону регулярных выражений. Это мой новый метод контроллера:

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

  });
person hansmei    schedule 04.06.2014