Samouczek schematu
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 _objectProperty wyodrębnia właściwości z każdego elementu obiektu JSON (przekazanego jako $adaptedSource), a następnie z _echo tworzy 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ć @deferredExport zamiast @export
  • Gdy używamy Dyrektyw Multi-Pole razem z @export (lub @deferredExport), eksportowana wartość jest obiektem JSON zawierającym wszystkie pola
  • Mutacja Post.update jest dostępna w schema tylko wtedy, gdy funkcja Zagnieżdżonych Mutacji jest włączona