Schema-tutorial
Schema-tutorialLes 7: Inhoud in bulk aanpassen

Les 7: Inhoud in bulk aanpassen

Deze tutorielles past inhoud in bulk aan, waarbij de titel, inhoud en samenvatting van meerdere berichten worden bijgewerkt met één GraphQL-verzoek.

Om deze GraphQL-query te laten werken, moet de Schema-configuratie die op het eindpunt is toegepast Geneste Mutaties hebben ingeschakeld

De onderstaande GraphQL-query haalt de gegevens op voor de meerdere berichten, voert een zoek-en-vervang uit op de velden title, content en excerpt voor elk van hen, past deze aan als invoer voor de mutatie, en exporteert één dynamische variabele $postInputs met alle resultaten als woordenboek, in het formaat:

{
  "${post ID}": {
    "title": "${adapted post title}",
    "excerpt": "${adapted post excerpt}"
  },
  // repeat for all other posts ...
}

In de mutation-operatie wordt elk van deze vermeldingen vervolgens opgehaald via _objectProperty (met ${post ID} als sleutel) en doorgegeven als input om het bericht bij te werken:

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
      }
    }
  }
}
  • De extensie Field on Field biedt de directive @applyField die, aangeroepen met _objectProperty, de eigenschappen uit elk item in het JSON-object (doorgegeven als $adaptedSource) extraheert, en vervolgens met _echo de bijbehorende JSON-invoer met die eigenschappen aanmaakt
  • Naast functievelden biedt de extensie PHP Functions via Schema ook functionaliteit via de bijbehorende "functie-directives", zoals @strReplaceMultiple
  • Wanneer Multi-Field Directives is ingeschakeld, kunnen we een directive toepassen op meer dan één veld, waarbij we de relatieve positie(s) van het/de aanvullende veld(en) aangeven via het argument affectAdditionalFieldsUnderPos
  • Wanneer we een directive toepassen op een veld en vervolgens de waarde ervan exporteren, moeten we @deferredExport gebruiken in plaats van @export
  • Wanneer we Multi-Field Directives samen met @export (of @deferredExport) gebruiken, is de geëxporteerde waarde een JSON-object met alle velden
  • Mutatie Post.update is alleen beschikbaar in het schema wanneer de functie Geneste Mutaties is ingeschakeld