Tutorial del esquema
Tutorial del esquemaLección 7: Adaptar contenido en bloque

Lección 7: Adaptar contenido en bloque

Esta lección del tutorial adapta contenido en bloque, actualizando el título, el contenido y el extracto de varias entradas con una sola petición GraphQL.

Para que esta consulta GraphQL funcione, la Creando una configuración del esquema aplicada al endpoint debe tener habilitadas las Usar mutaciones anidadas

La consulta GraphQL de abajo recupera los datos de las múltiples entradas, ejecuta un buscar y reemplazar en los campos title, content y excerpt para cada una de ellas, las adapta como entradas para la mutación, y exporta una única variable dinámica $postInputs con todos los resultados como diccionario, con formato:

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

En la operación mutation, cada una de estas entradas se recupera mediante _objectProperty (utilizando ${post ID} como clave) y se pasa como input para actualizar la entrada:

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
      }
    }
  }
}
  • La extensión Campo sobre Campo proporciona la directiva @applyField que, invocada con _objectProperty, extrae las propiedades de cada elemento del objeto JSON (pasado como $adaptedSource), y luego, con _echo, crea el input JSON correspondiente con esas propiedades
  • Además de los campos función, la extensión PHP Functions via Schema también proporciona funcionalidad mediante sus correspondientes "directivas función", como @strReplaceMultiple
  • Cuando Funcionalidades personalizadas para el esquema está habilitado, podemos aplicar una directiva a más de un campo, indicando la posición o posiciones relativas de los campos adicionales mediante el argumento affectAdditionalFieldsUnderPos
  • Cuando se aplica una directiva a algún campo y luego se exporta su valor, debemos usar @deferredExport en lugar de @export
  • Cuando se usan Multi-Field Directives junto con @export (o @deferredExport), el valor exportado es un objeto JSON que contiene todos los campos
  • La mutación Post.update está disponible en el esquema sólo cuando la característica Nested Mutations está habilitada