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
@applyFieldque, 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
@deferredExporten 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.updateestá disponible en el esquema sólo cuando la característica Nested Mutations está habilitada