Field To Input
Ambil nilai sebuah field, manipulasi nilainya, dan masukkan sebagai input ke field atau direktif lain, semuanya dalam satu operasi yang sama.
Teruskan nilai field field sebagai input ke field lain melalui $__field, dan sebagai input ke direktif melalui field @passOnwards(as: "variableName").
$__field
Teruskan nilai field sebagai input ke field lain. Sintaks untuk mereferensikan nilai field adalah: $ (yaitu simbol untuk variabel dalam GraphQL), diikuti oleh __ dan alias atau nama field.
Misalnya, nilai dari field excerpt direferensikan sebagai $__excerpt, dan postTitle: title direferensikan sebagai $__postTitle.
Respons dari field kedua dapat digunakan sendiri sebagai input ke field lain:
{
posts {
excerpt
# Referencing previous field with name "excerpt"
isEmptyExcerpt: _isEmpty(value: $__excerpt)
# Referencing previous field with alias "isEmptyExcerpt"
isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
}
}Responsnya akan berupa:
{
"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)
}Field tersebut juga tidak dapat direferensikan dari argumen direktif (untuk itu, gunakan @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)
}
}@passOnwards
Direktif @passOnwards membuat nilai yang telah di-resolve dari sebuah field tersedia untuk direktif-direktif berikutnya melalui variabel dinamis.
Dalam query di bawah, field notHasComments disusun dengan mengambil nilai dari field hasComments dan menghitung nilai kebalikannya. Cara kerjanya adalah:
- Membuat nilai field tersedia melalui
@passOnwards; nilai field kemudian dapat dimasukkan sebagai input ke direktif berikutnya mana pun @applyFieldmengambil input (yang diekspor di bawah variabel dinamis$postHasComments), menerapkan field globalnotke dalamnya, dan menyimpan hasilnya kembali ke dalam field
{
posts {
id
hasComments
notHasComments: hasComments
@passOnwards(as: "postHasComments")
@applyField(
name: "_not"
arguments: {
value: $postHasComments
},
setResultInResponse: true
)
}
}Ini akan menghasilkan:
{
"data": {
"posts": [
{
"id": 1724,
"hasComments": true,
"notHasComments": false
},
{
"id": 358,
"hasComments": false,
"notHasComments": true
},
{
"id": 555,
"hasComments": false,
"notHasComments": true
}
]
}
}Kita juga dapat mengambil nilai dari field mana pun yang telah di-resolve dalam objek, dengan meneruskan alias atau nama field di bawah arg property.
Misalnya, dalam query ini, kita mengakses nilai yang di-resolve berdasarkan nama field id, atau alias second, dan mengekspor nilai tersebut melalui variabel dinamis untuk mencetaknya pada query berikutnya:
query One {
id
second: _echo(value: 2)
@passOnwards(
property: "id",
as: "resolvedFirstValue"
)
@exportFrom(
scopedDynamicVariable: $resolvedFirstValue,
as: "firstValue"
)
third: _echo(value: 3)
@passOnwards(
property: "second",
as: "resolvedSecondValue"
)
@exportFrom(
scopedDynamicVariable: $resolvedSecondValue,
as: "secondValue"
)
}
query Two @depends(on: "One") {
firstValue: _echo(value: $firstValue)
secondValue: _echo(value: $secondValue)
}Ini akan menghasilkan:
{
"data": {
"id": "root",
"second": 2,
"third": 3,
"firstValue": "root",
"secondValue": 2
}
}Contoh
Jika kutipan post kosong, gunakan judul sebagai gantinya:
{
posts {
title
originalExcerpt: excerpt
isEmptyExcerpt: _isEmpty(value: $__originalExcerpt)
excerpt: _if(condition: $__isEmptyExcerpt, then: $__title, else: $__originalExcerpt)
}
}Ambil data dari endpoint REST eksternal, dan manipulasi datanya sesuai kebutuhan Anda.
{
externalData: _sendJSONObjectItemHTTPRequest(input: { url: "https://example.com/rest/some-external-endpoint"} )
userName: _objectProperty(object: $__externalData, by: { path: "data.user.name" })
userLastName: _objectProperty(object: $__externalData, by: { path: "data.user.surname" })
}Ini akan menghasilkan:
{
"data": {
"externalData": {
"data": {
"user": {
"id": 1,
"name": "Leo",
"surname": "Loso"
}
}
},
"userName": "Leo",
"userLastName": "Loso"
}
}Dengan menggunakan direktif @remove pada externalData, kita juga dapat menghindari pencetakan data sumber endpoint eksternal dalam respons:
{
externalData: _sendJSONObjectItemHTTPRequest(input: { url: "https://example.com/rest/some-external-endpoint" } ) @remove
userName: _objectProperty(object: $__externalData, by: { path: "data.user.name" })
userLastName: _objectProperty(object: $__externalData, by: { path: "data.user.surname" })
}Sekarang ini akan menghasilkan:
{
"data": {
"userName": "Leo",
"userLastName": "Loso"
}
}Ambil post untuk setiap pengguna yang menyebut email pengguna:
{
users {
email
posts(filter: { search: $__email }) {
id
title
}
}
}Kirim newsletter dengan mendefinisikan email to dan from melalui field 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: "..."
}
)
}Jalankan operasi kondisional berdasarkan nilai field. Dalam query ini, pengguna "Leo" dan "Peter" mendapatkan nama mereka dikonversi ke huruf kapital, karena mereka ada dalam array "pengguna istimewa", sementara "Martin" tidak:
query {
users {
name
@passOnwards(as: "userName")
@applyField(
name: "_inArray"
arguments: {
value: $userName
array: ["Leo", "John", "Peter"]
}
passOnwardsAs: "isSpecialUser"
)
@if(
condition: $isSpecialUser
)
@strUpperCase
}
}...menghasilkan:
{
"data": {
"users": [
{
"name": "LEO"
},
{
"name": "Martin"
},
{
"name": "PETER"
}
]
}
}