Samouczek schematuLekcja 7: Dostosowywanie treści zbiorczo
Lekcja 7: Dostosowywanie treści zbiorczo
Ta lekcja tutoriala dostosowuje treść zbiorczo, aktualizując tytuł, treść i fragment wielu postów za pomocą jednego żądania GraphQL.
Aby to zapytanie GraphQL działało, Konfiguracja Schema zastosowana do endpointu musi mieć włączone Zagnieżdżone Mutacje
Poniższe zapytanie GraphQL pobiera dane dla wielu postów, wykonuje wyszukiwanie i zastępowanie w polach title, content i excerpt dla każdego z nich, dostosowuje je jako dane wejściowe do mutacji i eksportuje jedną dynamiczną zmienną $postInputs ze wszystkimi wynikami jako słownik, w formacie:
{
"${post ID}": {
"title": "${adapted post title}",
"excerpt": "${adapted post excerpt}"
},
// repeat for all other posts ...
}W operacji mutation każdy z tych wpisów jest następnie pobierany za pomocą _objectProperty (używając ${post ID} jako klucza) i przekazywany jako input do aktualizacji posta:
query TransformAndExportData(
$limit: Int! = 5,
$offset: Int! = 0,
$replaceFrom: [String!]!
$replaceTo: [String!]!
) {
posts: posts(
pagination: { limit: $limit, offset: $offset }
sort: { by: ID, order: ASC }
) {
rawTitle
rawContent
rawExcerpt
@strReplaceMultiple(
search: $replaceFrom
replaceWith: $replaceTo
affectAdditionalFieldsUnderPos: [1, 2]
)
@deferredExport(
as: "postAdaptedSources"
type: DICTIONARY
affectAdditionalFieldsUnderPos: [1, 2]
)
}
}
query AdaptDataForMutationInput
@depends(on: "TransformAndExportData")
{
postInputs: _echo(value: $postAdaptedSources)
@underEachJSONObjectProperty(
passValueOnwardsAs: "adaptedSource",
affectDirectivesUnderPos: [1, 2, 3, 4]
)
@applyField(
name: "_objectProperty",
arguments: {
object: $adaptedSource,
by: {
key: "rawTitle"
}
},
passOnwardsAs: "adaptedTitle"
)
@applyField(
name: "_objectProperty",
arguments: {
object: $adaptedSource,
by: {
key: "rawExcerpt"
}
},
passOnwardsAs: "adaptedExcerpt"
)
@applyField(
name: "_objectProperty",
arguments: {
object: $adaptedSource,
by: {
key: "rawContent"
}
},
passOnwardsAs: "adaptedContent"
)
@applyField(
name: "_echo",
arguments: {
value: {
title: $adaptedTitle,
excerpt: $adaptedExcerpt,
contentAs: {
html: $adaptedContent
}
}
},
setResultInResponse: true
)
@export(as: "postInputs")
}
mutation UpdatePost(
$limit: Int! = 5,
$offset: Int! = 0
)
@depends(on: "AdaptDataForMutationInput")
{
adaptedPosts: posts(
pagination: { limit: $limit, offset: $offset }
sort: { by: ID, order: ASC }
) {
id
postInput: _objectProperty(
object: $postInputs,
by: { key: $__id }
) @remove
update(input: $__postInput) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
title
content
excerpt
}
}
}
}- Rozszerzenie Field on Field udostępnia dyrektywę
@applyField, która wywoływana z_objectPropertywyodrębnia właściwości z każdego elementu obiektu JSON (przekazanego jako$adaptedSource), a następnie z_echotworzy odpowiedni JSON input z tymi właściwościami - Oprócz pól funkcji, rozszerzenie PHP Functions via Schema zapewnia również funkcjonalność za pośrednictwem odpowiednich "dyrektyw funkcji", takich jak
@strReplaceMultiple - Gdy włączone są Dyrektywy Multi-Pole, możemy zastosować dyrektywę do więcej niż jednego pola, wskazując względne położenie dodatkowych pól za pomocą argumentu
affectAdditionalFieldsUnderPos - Gdy stosujemy dyrektywę do jakiegoś pola i następnie eksportujemy jej wartość, należy użyć
@deferredExportzamiast@export - Gdy używamy Dyrektyw Multi-Pole razem z
@export(lub@deferredExport), eksportowana wartość jest obiektem JSON zawierającym wszystkie pola - Mutacja
Post.updatejest dostępna w schema tylko wtedy, gdy funkcja Zagnieżdżonych Mutacji jest włączona