スキーマの設定
スキーマの設定ネストされたmutationの使用

ネストされたmutationの使用

ネストされたmutationを使用すると、GraphQLのルート型以外の型に対してmutationを実行できます。

以下のクエリは、ルート型のmutationフィールド updatePost を使用した標準的なmutationを実行します:

mutation {
  updatePost(input: {
    id: 5,
    title: "New title"
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      title
    }
  }
}

上記のクエリは、ネストされたmutationでも実行できます。まずフィールド post でpostオブジェクトを取得し、次に Post 型に属するmutationフィールド update をpostオブジェクトに適用します:

mutation {
  post(by: {id: 5}) {
    update(input: {
      title: "New title"
    }) {
      status
      post {
        title
      }
    }
  }
}

mutationをネストして、別のmutationの結果に対してデータを変更することもできます:

mutation {
  createPost(input: {
    title: "First title"
  }) {
    status
    postID
    post {
      update(input: {
        title: "Second title",
        contentAs: { html: "Some content" }
      }) {
        status
        post {
          title
          content
          addComment(input: {
            commentAs: { html: "My first comment" }
          }) {
            status
            commentID
            comment {
              content
              date
            }
          }
        }
      }
    }
  }
}

簡略化されたルート型

ネストされたmutationにより、ルート型が QueryRootMutationRoot から、クエリとmutationの両方を処理する単一の Root 型に変わります:

スキーマドキュメントのネストされたmutation

mutationフィールドの可視化

Voyagerクライアントを使用して、どのフィールドがmutationフィールドであるかを可視化できます。

ネストされたmutationでは、スキーマ内のすべての型にクエリフィールドとmutationフィールドの両方を含めることができます。区別するために、mutationフィールドの説明にはラベル "[Mutation] " が先頭に付加されます。

たとえば、Root 型のフィールドは次のようになります:

GraphiQLドキュメントのRoot型の説明

エンドポイントでのネストされたmutationの使用

スキーマがネストされたmutationを使用するかどうかは、2つのレベルで定義できます。優先順位の高い順に:

1. スキーマ設定での定義

カスタムエンドポイントまたはpersisted queryがネストされたmutationを使用するようにするには、対応するスキーマ設定で定義します:

スキーマ設定のmutationスキーム

2. 設定で定義されたデフォルトモード

スキーマ設定の値が "Default" の場合、設定で定義されたモードが使用されます:

ネストされたmutationの設定
ネストされたmutationの設定

ネストされたmutationの設定

スキーマに対して選択できる動作は3つあります:

1. ネストされたmutationを有効にしない

このオプションは、スキーマのネストされたmutationを無効にします(代わりに標準の動作を使用します)。

2. ネストされたmutationを有効にし、すべてのmutationフィールドをルートに残す

ネストされたmutationが有効な場合、mutationフィールドはスキーマに2回追加される可能性があります:

  • Root 型の下に1回
  • 特定の型の下に1回

たとえば:

  • Root.updatePost
  • Post.update

このオプションでは、ルート型からの「重複した」mutationフィールドが保持されます。

3. ネストされたmutationを有効にし、ルートから冗長なmutationフィールドを削除する

上記と同じオプションですが、ルート型から「重複した」mutationフィールドを削除します。

たとえば:

  • Root.updatePost は削除されます
  • Post.update が利用可能です

GraphQL仕様

この機能は現在GraphQL仕様には含まれていませんが、要望が寄せられています: