Field To Input
Bir alanın değerini alın, işleyin ve aynı işlem içinde başka bir alana ya da direktife girdi olarak aktarın.
field alanının değerini $__field aracılığıyla başka bir alana, field @passOnwards(as: "variableName") aracılığıyla ise bir direktife girdi olarak aktarın.
$__field
Alan değerini başka bir alana girdi olarak aktarın. Alan değerine başvurmak için kullanılan sözdizimi şöyledir: $ (GraphQL'deki değişken sembolü), ardından __ ve alanın takma adı ya da adı.
Örneğin, excerpt alanının değerine $__excerpt olarak, postTitle: title alanına ise $__postTitle olarak başvurulur.
İkinci alanın yanıtı da başka bir alana girdi olarak kullanılabilir:
{
posts {
excerpt
# Referencing previous field with name "excerpt"
isEmptyExcerpt: _isEmpty(value: $__excerpt)
# Referencing previous field with alias "isEmptyExcerpt"
isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
}
}Yanıt şu şekilde olacaktır:
{
"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)
}Alana bir direktif argümanından da başvurulamaz (bunun için @passOnwards kullanın):
# 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
@passOnwards direktifi, alanın çözümlenmiş değerini dinamik bir değişken aracılığıyla sonraki direktiflere kullanılabilir hale getirir.
Aşağıdaki query'de, notHasComments alanı; hasComments alanının değeri alınarak ve bunun karşıt değeri hesaplanarak oluşturulur. Bu şu şekilde çalışır:
- Alanın değeri
@passOnwardsaracılığıyla kullanılabilir hale getirilir; ardından bu değer sonraki herhangi bir direktife girdi olarak verilebilir @applyField, girdiyi (dinamik değişken$postHasCommentsaltında dışa aktarılan) alır, üzerine globalnotalanını uygular ve sonucu alana geri kaydeder
{
posts {
id
hasComments
notHasComments: hasComments
@passOnwards(as: "postHasComments")
@applyField(
name: "_not"
arguments: {
value: $postHasComments
},
setResultInResponse: true
)
}
}Bu şunu üretecektir:
{
"data": {
"posts": [
{
"id": 1724,
"hasComments": true,
"notHasComments": false
},
{
"id": 358,
"hasComments": false,
"notHasComments": true
},
{
"id": 555,
"hasComments": false,
"notHasComments": true
}
]
}
}property argümanı altında takma adı ya da alan adını geçirerek nesnedeki herhangi bir çözümlenmiş alanın değerini de alabiliriz.
Örneğin, bu query'de çözümlenmiş değere id alan adı veya second takma adıyla erişiyor ve bu değeri sonraki bir query'de yazdırmak üzere dinamik bir değişken aracılığıyla dışa aktarıyoruz:
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)
}Bu şunu üretecektir:
{
"data": {
"id": "root",
"second": 2,
"third": 3,
"firstValue": "root",
"secondValue": 2
}
}Örnekler
Gönderinin özeti boşsa, bunun yerine başlığı kullanın:
{
posts {
title
originalExcerpt: excerpt
isEmptyExcerpt: _isEmpty(value: $__originalExcerpt)
excerpt: _if(condition: $__isEmptyExcerpt, then: $__title, else: $__originalExcerpt)
}
}Harici bir REST uç noktasından veri alın ve gereksinimlerinize uyacak şekilde işleyin.
{
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" })
}Bu şunu üretecektir:
{
"data": {
"externalData": {
"data": {
"user": {
"id": 1,
"name": "Leo",
"surname": "Loso"
}
}
},
"userName": "Leo",
"userLastName": "Loso"
}
}externalData üzerinde @remove direktifini kullanarak yanıtta harici uç nokta kaynak verilerinin yazdırılmasını da önleyebiliriz:
{
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" })
}Bu artık şunu üretecektir:
{
"data": {
"userName": "Leo",
"userLastName": "Loso"
}
}Her kullanıcının e-postasından söz eden gönderileri her kullanıcı için alın:
{
users {
email
posts(filter: { search: $__email }) {
id
title
}
}
}optionValue alanı aracılığıyla to ve from e-postalarını tanımlayarak bir bülten gönderin:
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: "..."
}
)
}Alan değerine göre koşullu işlemler gerçekleştirin. Bu query'de, "Leo" ve "Peter" kullanıcıları "özel kullanıcı" dizisinde yer aldığından adları büyük harfe dönüştürülürken "Martin" için bu işlem uygulanmaz:
query {
users {
name
@passOnwards(as: "userName")
@applyField(
name: "_inArray"
arguments: {
value: $userName
array: ["Leo", "John", "Peter"]
}
passOnwardsAs: "isSpecialUser"
)
@if(
condition: $isSpecialUser
)
@strUpperCase
}
}...şunu üretir:
{
"data": {
"users": [
{
"name": "LEO"
},
{
"name": "Martin"
},
{
"name": "PETER"
}
]
}
}