스키마 튜토리얼
스키마 튜토리얼레슨 7: 콘텐츠 일괄 적용

레슨 7: 콘텐츠 일괄 적용

이 튜토리얼 레슨에서는 단일 GraphQL 요청으로 여러 게시물의 제목, 콘텐츠, 발췌문을 업데이트하여 콘텐츠를 일괄 적용합니다.

이 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 기능이 활성화된 경우에만 스키마에서 사용할 수 있습니다