スキーマの設定
スキーマの設定マルチフィールドディレクティブの使用

マルチフィールドディレクティブの使用

マルチフィールドディレクティブとは、1つのフィールドだけでなく、複数のフィールドに適用できるディレクティブです。有効にすると、すべてのディレクティブに引数 affectAdditionalFieldsUnderPos が追加され、ディレクティブを適用する追加フィールドの相対位置を指定できます。

例えば、次のクエリでは、ディレクティブ @strTranslate はフィールド content にのみ適用されています:

{
  posts {
    excerpt
    content @strTranslate
  }
}

フィールド excerpt にもディレクティブ @strTranslate を適用するには、ディレクティブ引数 affectAdditionalFieldsUnderPos に値 [1] を追加します(1 はディレクティブ @strTranslate からフィールド excerpt までの相対位置です):

{
  posts {
    excerpt
    content
      @strTranslate(
        affectAdditionalFieldsUnderPos: [1]
      )
  }
}

追加できるフィールド数に制限はありません。次のクエリでは、dateStr も翻訳対象に含まれています:

{
  posts {
    dateStr
    excerpt
    content
      @strTranslate(
        affectAdditionalFieldsUnderPos: [1, 2]
      )
  }
}

ディレクティブが本来適用されるフィールド(上記のすべてのクエリにおける content など)は、引数に指定する必要はありません。

上記のクエリにおいて、ディレクティブ @strTranslate から前のフィールドまでの相対位置は次のとおりです:

  • 位置 2dateStr
  • 位置 1excerpt
  • 位置 0content <= 暗黙的に、常に適用される

ユースケース

この機能には主に2つのユースケースがあります:

  1. パフォーマンス
  2. 拡張機能

パフォーマンス

外部 API への呼び出しを実行するディレクティブでは、リクエスト数が少ないほど高速に解決されます。

これはディレクティブ @strTranslate の場合に当てはまります。このディレクティブは Google Translate API に接続します。通常、投稿一覧のフィールド contentexcerpt を翻訳するには、次のクエリを使用します:

query {
  posts {
    excerpt @strTranslate
    content @strTranslate
  }
}

@strTranslate を2回追加することで、このクエリは Google Translate API に2回リクエストを実行します(excerpt の全値を翻訳するために1回、content の全値のために1回)。

Multi-Field Directives 機能を使用することで、以下のクエリでも contentexcerpt の両フィールドの全値を翻訳しますが、Google Translate API へのリクエストは1回だけで済みます:

query {
  posts {
    excerpt
    content
      @strTranslate(
        affectAdditionalFieldsUnderPos: [1]
      )
  }
}

拡張機能

追加フィールドを受け取るディレクティブは、追加の計算を提供できます。

例えば、ディレクティブ @export は通常、ログイン中のユーザー名など、単一フィールドの値をエクスポートします:

query GetLoggedInUserName {
  me {
    name @export(as: "userName")
  }
}

引数 affectAdditionalFieldsUnderPos を使用することで、@export は複数のフィールドを受け取り、それらのフィールドをエントリとして含むディクショナリをエクスポートします:

query GetLoggedInUserNameAndSurname {
  me {
    name
    surname
      @export(
        as: "userProps"
        affectAdditionalFieldsUnderPos: [1]
      )
  }
}

@export は変数 $userProps に次の値を生成します:

{
  "name": "Leo",
  "surname": "Loso"
}

設定

GraphQL スキーマでマルチフィールドディレクティブを有効または無効にするには、設定ページの「Multi-Field Directives」モジュールに移動し、Enable multi-field directives? のチェックボックスをオン/オフにします:

Multi-Field Directives の設定
Multi-Field Directives の設定

特定のエンドポイントでマルチフィールドディレクティブを有効または無効にするには、対応する Schema Configuration のブロック「Multi-Field Directives」で希望のオプションを選択します:

Schema Configuration の Multi-Field Directives
Schema Configuration の Multi-Field Directives