スキーマチュートリアル
スキーマチュートリアルレッスン7: コンテンツの一括適応

レッスン7: コンテンツの一括適応

このチュートリアルレッスンでは、単一のGraphQLリクエストで複数の投稿のタイトル、コンテンツ、抜粋を更新することで、コンテンツを一括適応します。

このGraphQLクエリを機能させるには、エンドポイントに適用されるスキーマ設定ネストされたミューテーションが有効になっている必要があります。

以下のGraphQLクエリは、複数の投稿のデータを取得し、それぞれのtitlecontentexcerptフィールドに対して検索・置換を実行し、これらをミューテーションへの入力として適応させ、すべての結果を辞書形式で含む単一の動的変数$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で追加フィールドの相対位置を指定することで、1つのディレクティブを複数のフィールドに適用できます
  • あるフィールドにディレクティブを適用してからその値をエクスポートする場合、@exportの代わりに@deferredExportを使用する必要があります
  • Multi-Field Directivesを@export(または@deferredExport)と共に使用すると、エクスポートされる値はすべてのフィールドを含むJSONオブジェクトになります
  • ミューテーションPost.updateは、Nested Mutations機能が有効な場合にのみスキーマで利用可能です