Schema-Tutorial
Schema-TutorialLektion 7: Inhalte in Massen anpassen

Lektion 7: Inhalte in Massen anpassen

Diese Tutorial-Lektion passt Inhalte in Massen an und aktualisiert dabei Titel, Inhalt und Auszug mehrerer Beiträge mit einer einzigen GraphQL-Anfrage.

Damit diese GraphQL-Query funktioniert, muss die Schema-Konfiguration, die auf den Endpoint angewendet wird, Nested Mutations aktiviert haben

Die folgende GraphQL-Query ruft die Daten mehrerer Beiträge ab, führt eine Suche und Ersetzung in den Feldern title, content und excerpt für jeden davon durch, passt diese als Eingaben für die Mutation an und exportiert eine einzige dynamische Variable $postInputs mit allen Ergebnissen als Dictionary im Format:

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

In der mutation-Operation wird jeder dieser Einträge dann über _objectProperty abgerufen (wobei ${post ID} als Schlüssel verwendet wird) und als input übergeben, um den Beitrag zu aktualisieren:

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
      }
    }
  }
}
  • Die Erweiterung Field on Field stellt die Direktive @applyField bereit, die mit _objectProperty die Eigenschaften aus jedem Element des JSON-Objekts (übergeben als $adaptedSource) extrahiert und dann mit _echo den entsprechenden JSON-Input mit diesen Eigenschaften erstellt
  • Neben Funktionsfeldern bietet die Erweiterung PHP Functions via Schema auch Funktionalität über entsprechende „Funktionsdirektiven", wie z. B. @strReplaceMultiple
  • Wenn Multi-Field Directives aktiviert ist, können wir eine Direktive auf mehr als ein Feld anwenden und dabei die relativen Positionen der zusätzlichen Felder über das Argument affectAdditionalFieldsUnderPos angeben
  • Wenn du eine Direktive auf ein Feld anwendest und dessen Wert dann exportierst, musst du @deferredExport statt @export verwenden
  • Wenn du Multi-Field Directives zusammen mit @export (oder @deferredExport) verwendest, ist der exportierte Wert ein JSON-Objekt, das alle Felder enthält
  • Die Mutation Post.update ist im Schema nur verfügbar, wenn die Funktion Nested Mutations aktiviert ist