Вопрос

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

Интересно, можно ли отправить шаблон регулярного выражения SQL в функцию 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».

Это было полезно?

Решение

Карты ватерлиний .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);});
    });
});

Другие советы

Автор Редактировать:

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

  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)
      }
    })
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top