스키마 튜토리얼레슨 7: 콘텐츠 일괄 적용
레슨 7: 콘텐츠 일괄 적용
이 튜토리얼 레슨에서는 단일 GraphQL 요청으로 여러 게시물의 제목, 콘텐츠, 발췌문을 업데이트하여 콘텐츠를 일괄 적용합니다.
아래의 GraphQL 쿼리는 여러 게시물의 데이터를 가져오고, 각 게시물의 title, content, excerpt 필드에 대해 검색 및 교체를 실행하며, 이를 뮤테이션 입력으로 적용하고, 모든 결과를 다음 형식의 딕셔너리로 포함하는 단일 동적 변수 $postInputs를 내보냅니다:
{
"${post ID}": {
"title": "${adapted post title}",
"excerpt": "${adapted post excerpt}"
},
// repeat for all other posts ...
}mutation 오퍼레이션에서는 각 항목이 _objectProperty(${post ID}를 키로 사용)를 통해 가져와지고, 게시물을 업데이트하기 위한 input으로 전달됩니다:
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
}
}
}
}- Field on Field 확장 기능은 디렉티브
@applyField를 제공합니다. 이를_objectProperty와 함께 호출하면 JSON 오브젝트($adaptedSource로 전달됨)의 각 항목에서 속성을 추출하고, 그다음_echo로 해당 속성을 가진 JSON 입력을 생성합니다 - 함수 필드 외에도, PHP Functions via Schema 확장 기능은
@strReplaceMultiple과 같은 대응하는 "함수 디렉티브"를 통해 기능을 제공합니다 - Multi-Field Directives가 활성화된 경우, 인수
affectAdditionalFieldsUnderPos로 추가 필드의 상대적 위치를 지정하여 하나의 디렉티브를 여러 필드에 적용할 수 있습니다 - 특정 필드에 디렉티브를 적용한 후 그 값을 내보낼 때는
@export대신@deferredExport를 사용해야 합니다 - Multi-Field Directives를
@export(또는@deferredExport)와 함께 사용하면, 내보내진 값은 모든 필드를 포함하는 JSON 오브젝트가 됩니다 - 뮤테이션
Post.update는 Nested Mutations 기능이 활성화된 경우에만 스키마에서 사용할 수 있습니다