문제

데이터 처리를 위해 워터라인 ORM을 사용하여 SailsJS(베타)에서 간단한 검색 기능을 만들려고 합니다.내 컨트롤러의 내 기능은 미리 정의된 흘수선의 find() 메서드를 사용하여 검색을 수행합니다.

일치하는 REGEXP를 가진 모든 사용자를 가져오도록 SQL-regexp 패턴을 워터라인 find() 함수에 보낼 수 있는지 궁금합니다.

내 컨트롤러의 찾기 메서드에는 다음이 포함되어 있습니다(내가 요구하는 정규식 기능은 제외).

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

다른 팁

작성자 편집 :

답변에 감사드립니다. 그러나 나는 정규식 패턴 검색을 사용하지 않고도 내 문제에 적합한 해결책을 찾을 수 있었다.이것은 내 새로운 컨트롤러 방법입니다 :

  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