스키마 설정
스키마 설정"field to input" 사용하기

"field to input" 사용하기

필드의 값을 가져와 조작하고, 동일한 쿼리 내에서 다른 필드의 입력으로 전달할 수 있습니다.

사용 방법

값을 가져올 필드는 "Variable" 구문인 $와 필드 별칭 또는 이름 앞에 __를 붙여 참조합니다. (예를 들어, excerpt 필드의 값은 $__excerpt로 참조합니다.) 두 번째 필드의 응답은 그 자체로 다른 필드의 입력으로 사용될 수 있습니다.

{
  posts {
    excerpt
 
    # Referencing previous field with name "excerpt"
    isEmptyExcerpt: _isEmpty(value: $__excerpt)
 
    # Referencing previous field with alias "isEmptyExcerpt"
    isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
  }
}

응답은 다음과 같습니다:

{
  "data": {
    "posts": [
      {
        "excerpt": "Some post excerpt",
        "isEmptyExcerpt": false,
        "isNotEmptyExcerpt": true
      },
      {
        "excerpt": "",
        "isEmptyExcerpt": true,
        "isNotEmptyExcerpt": false
      }
    ]
  }
}

필드는 동일한 노드 내의 이전 형제 필드에서만 참조할 수 있습니다. 다음 쿼리는 동작하지 않습니다:

# This will fail because the reference to the field must appear after the field, not before
{
  posts {
    isEmptyExcerpt: _isEmpty(value: $__excerpt)
    excerpt
  }
}
 
# This will fail because the reference must be done within the same node
{
  posts {
    excerpt
  }
  isEmptyExcerpt: _isEmpty(value: $__excerpt)
}

또한 필드는 디렉티브 인수에서 참조할 수 없습니다 (그 경우에는 @passOnwards 디렉티브를 사용하세요):

# This will fail because the reference can be only used as input to a field, not to a directive
{
  posts {
    hasComments
    title @include(if: $__hasComments)
  }
}

사용 예시

포스트의 발췌문이 비어 있는 경우 제목을 대신 사용합니다:

{
  posts {
    title
    originalExcerpt: excerpt
    isEmptyExcerpt: _isEmpty(value: $__originalExcerpt)
    excerpt: if(condition: $__isEmptyExcerpt, then: $__title, else: $__originalExcerpt)
  }
}

외부 REST 엔드포인트에서 데이터를 가져와 요구 사항에 맞게 데이터를 조작합니다.

{
  externalData: _getJSON(url: "https://example.com/rest/some-external-endpoint")
  userName: _extract(object: $__externalData, path: "data.user.name")
  userLastName: _extract(object: $__externalData, path: "data.user.surname")
}

이렇게 하면 다음 결과가 생성됩니다:

{
  "data": {
    "externalData": {
      "data": {
        "user": {
          "id": 1,
          "name": "Leo",
          "surname": "Loso"
        }
      }
    },
    "userName": "Leo",
    "userLastName": "Loso"
  }
}

externalData@remove 디렉티브를 사용하면 응답에서 외부 엔드포인트의 소스 데이터를 출력하지 않을 수도 있습니다:

{
  externalData: _getJSON(url: "https://example.com/rest/some-external-endpoint") @remove
  userName: _extract(object: $__externalData, path: "data.user.name")
  userLastName: _extract(object: $__externalData, path: "data.user.surname")
}

이제 다음 결과가 생성됩니다:

{
  "data": {
    "userName": "Leo",
    "userLastName": "Loso"
  }
}

사용자의 이메일 주소를 언급하는 모든 사용자의 포스트를 가져옵니다:

{
  users {
    email
    posts(filter: { search: $__email }) {
      id
      title
    }
  }
}

optionValue 필드를 통해 tofrom 이메일 주소를 정의하여 뉴스레터를 발송합니다:

mutation {
  fromEmail: optionValue(name: "admin_email")
  toEmail: optionValue(name: "subscribers_email_list_recipient_address")
  _sendEmail(
    from: {
      email: $__fromEmail
    }
    to: $__toEmail
    subject: "Weekly summary"
    messageAs: {
      html: "..."
    }
  )
}