2016-10-26 5 views
1

는 :중첩 된 쿼리 개체 매핑 내가 방법 <a href="http://vitaly-t.github.io/pg-promise/Database.html#.map" rel="nofollow">map</a>에 대한 <a href="https://github.com/vitaly-t/pg-promise" rel="nofollow">pg-promise</a>에서 예를 통해 갈거야

// Build a list of active users, each with the list of user events: 
db.task(t => { 
    return t.map('SELECT id FROM Users WHERE status = $1', ['active'], user => { 
     return t.any('SELECT * FROM Events WHERE userId = $1', user.id) 
      .then(events=> { 
       user.events = events; 
       return user; 
      }); 
    }).then(t.batch); 
}) 
    .then(data => { 
     // success 
    }) 
    .catch(error => { 
     // error 
    }); 

는의가 Event 엔티티는 예를 들어, 많은 관계로 하나를 가지고 있다고 가정 해 봅시다 Cars, 그리고 각 event에 연결된 모든 cars을 나열하고 싶습니다. 원하는 객체가 둘 이상의 레벨보다 깊을 때 어떻게 map 함수를 사용할 수 있습니까?

나는이 같은 것을 볼 수 있었다 원하는 결과 :

[{ 
    //This is a user 
    id: 2, 
    first_name: "John", 
    last_name: "Doe", 
    events: [{ 
     id: 4, 
     type: 'type', 
     cars: [{ 
      id: 4, 
      brand: 'bmw' 
     }] 
    }] 
}] 

답변

3

내가 pg-promise의 저자입니다. map 매핑 다른 무언가로 행을 검색, 우리는 약속으로 그들을지도하기 때문에, 사람들이있는 우리가 사용하는, 해결 될 필요가 단순화

db.task(getUsers) 
    .then(users => { 
     // users = an object tree of users->events->cars 
    }) 
    .catch(error => { 
     // error 
    }); 

방법 : 그것을 사용


function getUsers(t) { 
    return t.map('SELECT * FROM Users WHERE status = $1', ['active'], user => { 
     return t.map('SELECT * FROM Events WHERE userId = $1', user.id, event=> { 
      return t.any('SELECT * FROM Cars WHERE eventId = $1', event.id) 
       .then(cars=> { 
        event.cars = cars; 
        return event; 
       }); 
     }) 
      .then(t.batch) // settles array of requests for Cars (for each event) 
      .then(events=> { 
       user.events = events; 
       return user; 
      }); 
    }).then(t.batch); // settles array of requests for Events (for each user) 
} 
그리고 방법 batch. 우리는 cars에 대한 요청의 각 내부 배열에 대해 수행 한 다음 최상위 수준에서 events에 대한 요청 배열을 해결합니다.


여기에서 찾을 수 있습니다 빠른 단일 쿼리 방법도 있습니다 :