Cấu hình schema
Cấu hình schemaSử dụng "field to input"

Sử dụng "field to input"

Lấy giá trị của một trường, thao tác với nó, và đưa vào một trường khác, tất cả trong cùng một query.

Cách sử dụng

Trường cần lấy giá trị được tham chiếu bằng cú pháp "Variable" $, và __ trước alias hoặc tên trường. (Ví dụ, giá trị từ trường excerpt được tham chiếu là $__excerpt.) Phản hồi từ trường thứ hai bản thân nó có thể được dùng làm đầu vào cho một trường khác:

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

Phản hồi sẽ là:

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

Trường chỉ có thể được tham chiếu bởi bất kỳ trường anh em trước đó của nó trong cùng một node. Các queries sau đây sẽ KHÔNG hoạt động:

# 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)
}

Trường cũng không thể được tham chiếu từ đối số của một directive (cho trường hợp đó, hãy dùng directive @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)
  }
}

Ví dụ

Nếu đoạn trích của bài viết rỗng, hãy dùng tiêu đề thay thế:

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

Lấy dữ liệu từ một REST endpoint bên ngoài, và thao tác dữ liệu đó để phù hợp với yêu cầu của bạn.

{
  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")
}

Kết quả sẽ là:

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

Sử dụng directive @remove trên externalData, chúng ta cũng có thể tránh in dữ liệu nguồn của endpoint bên ngoài trong phản hồi:

{
  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")
}

Kết quả lúc này sẽ là:

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

Lấy các bài viết của mỗi người dùng có đề cập đến email của người dùng đó:

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

Gửi một newsletter với các email tofrom được xác định thông qua trường optionValue:

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: "..."
    }
  )
}