スキーマチュートリアルレッスン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で追加フィールドの相対位置を指定することで、1つのディレクティブを複数のフィールドに適用できます - あるフィールドにディレクティブを適用してからその値をエクスポートする場合、
@exportの代わりに@deferredExportを使用する必要があります - Multi-Field Directivesを
@export(または@deferredExport)と共に使用すると、エクスポートされる値はすべてのフィールドを含むJSONオブジェクトになります - ミューテーション
Post.updateは、Nested Mutations機能が有効な場合にのみスキーマで利用可能です
Next