2016-07-04 3 views
0

나는 투표 할 수있는 투표와 함께 투표 신청을 만들고 있습니다. 나는 현재 투표 (기본적으로 투표 만들기)에 투표하고 있습니다.React Relay : 복잡한 돌연변이 체지방 쿼리

내 스키마 :

(길고도 짧은 이야기 :. 여론 조사는 본점에서 액세스 할 수 있지만 시청자의 투표 및 투표가 필드로 (그를 직접 액세스 할 수 있습니다) 투표는 최소 저장소에서 액세스 할 수 있습니다, 그러나 여론 조사의 투표은 직접도 액세스 할 수 있습니다.

query { 
    store { 
    polls { //poll connection 
     edges { 
     node { //poll 
      votes { //vote connection 
      ... 
      } 
     } 
     } 
    } 
    votes { //vote connection 
     edges { 
     node { //vote 
      ... 
     } 
     } 
    } 
    } 
    viewer { 
    polls { //poll connection 
     edges { 
     node { //poll 
      votes { //vote connection 
      ... 
      } 
     } 
     } 
    } 
    votes { //vote connection 
     edges { 
     node { //vote 
      ... 
     } 
     } 
    } 
    } 
} 

이 복잡한 스키마가 변경 될 수있는 모든 것을 정의해야하기 때문에 나는 내 지방 쿼리를 정의하는 방법에 대해 저를 혼동한다.

을 여기에 ' 변경 될 수있는 것 :

  1. 팻 (fat 쿼리에서 voteEdge)이 작성되었습니다.
  2. 스토어에서 투표 연결에 투표가 추가되었습니다.
  3. 투표자의 투표 연결에 투표가 추가되었습니다.
  4. 저장중인 폴링 연결의 일부 설문 조사에서 투표 연결에 투표가 추가되었습니다.
  5. (설문 조사자가 설문 조사자이기도 한 경우에만 가능) : 설문 조사에서 설문 조사를 통해 투표 연결에 투표가 추가됩니다.

그럼 제 질문은 어떻게해야 내 허황한 쿼리에서이를 표현해야합니까?

getFatQuery() { 
    return Relay.QL` 
     fragment on CreateVoteMutation { 
     voteEdge, 
     viewer{ 
      polls, 
      voteCount 
      votes, 
     }, 
     store{ 
      polls, 
      voteCount, 
      votes, 
     } 
     } 
    `; 
    } 

아니면 여론 조사에서 투표를해야합니까?

getFatQuery() { 
    return Relay.QL` 
     fragment on CreateVoteMutation { 
     voteEdge, 
     viewer{ 
      polls{ 
      edges{ 
       node{ 
       voteCount, 
       votes 
       } 
      } 
      }, 
      voteCount 
      votes, 
     }, 
     store{ 
      polls{ 
      edges{ 
       node{ 
       voteCount, 
       votes 
       } 
      } 
      }, 
      voteCount, 
      votes, 
     } 
     } 
    `; 
    } 

고마워요!

답변

1

올바른 생각을 갖고있는 것 같습니다. Relay에서 FatQuery를 정의 할 때, 반환 필드는 가능한 한 최적으로 유지해야합니다. 이는 GraphQL의 이점이기 때문에 (클라이언트에서 사용할 것보다 더 많이 반환 할 필요가 없기 때문입니다). 그래서 FatQuery은 다음과 같아야합니다

getFatQuery() { 
    return Relay.QL` 
     fragment on CreateVoteMutation { 
     voteEdge, 
     viewer{ 
      polls { // this is most likely a GraphQL object type, so you'll need a sub-selection, but you don't necessarily need to return all the Votes again since you do that later 
      name 
      timestamp 
      } 
      voteCount // scalar integer 
      votes { // again, here you'll need to return a sub-selection since Votes is a GraphQL object type 
      name 
      timestamp 
      } 
     }, 
     store{ 
      polls { // this is most likely a GraphQL object type, so you'll need a sub-selection, but you don't necessarily need to return all the Votes again since you do that later 
      name 
      timestamp 
      } 
      voteCount // scalar integer 
      votes { // again, here you'll need to return a sub-selection since Votes is a GraphQL object type 
      name 
      timestamp 
      } 
     } 
     } 
    `; 
    } 

아이디어는 당신이 기술적으로 polls의 하위 선택으로 다시 votes를 반환 할 수 있다는 것입니다; 그러나, 당신이 돌아올 때부터 이미 관찰자 아래에있을 필요가 없습니다. 그러면 총 투표 수와 시스템의 모든 투표 수가 표시됩니다. 이 도움이

getFatQuery() { 
    return Relay.QL` 
     fragment on CreateVoteMutation { 
     voteEdge, 
     viewer{ 
      polls { // this is most likely a GraphQL object type, so you'll need a sub-selection, but you don't necessarily need to return all the Votes again since you do that later 
      name 
      timestamp 
      voteCount // scalar integer 
      votes { // again, here you'll need to return a sub-selection since Votes is a GraphQL object type 
       name 
       timestamp 
      } 
      } 
     }, 
     store{ 
      polls { // this is most likely a GraphQL object type, so you'll need a sub-selection, but you don't necessarily need to return all the Votes again since you do that later 
      name 
      timestamp 
      voteCount // scalar integer 
      votes { // again, here you'll need to return a sub-selection since Votes is a GraphQL object type 
       name 
       timestamp 
      } 
      } 
     } 
     } 
    `; 
    } 

희망 : 당신이 설문 조사에 의한 투표 및 VoteCount를 필터링하고 싶다면, 당신은 다음과 같이 보일 것 반대를 할 수있는!

+0

다시 한번 감사 드리겠습니다. 릴레이 팻 쿼리의 핵심은 변이를 실행 한 후에 변경할 수있는 모든 데이터를 정의하는 것이라고 생각합니다. 그렇다면 대답에서 선택한 옵션 중에서 어떻게 선택할 수 있습니까? 각각 하나만 변경 될 수있는 부분 만 표시됩니다. 내가 놓친 것이 있습니까? –

+1

예, 요점은 변경해야하는 모든 데이터의 컨텍스트를 제공하는 것입니다. Relay의 getOptimisticResponse를 사용하여 성능을 위해 캐시 저장소에서로드하는 압축 된 쿼리를 제공 할 수 있으며 getFatQuery는 앱의 마지막에 원하는 전체 쿼리입니다.전체 유형 및 서브 필드 일 필요는 없습니다. – vince