web-dev-qa-db-ja.com

GraphQLフィールドは、渡された引数に基づくポリモーフィズムをサポートしていますか?

次のクエリを定義したい

{
// return all individuals
individuals {
    id
  }
}

// return ONE individual by id
individuals(id:"123") {
   id
  }
}

クエリ名は同じで、パラメータのみが異なることに注意してください。

今日、私が見つけた唯一の回避策は、さまざまなクエリ名を定義することです。

ポリモーフィッククエリを定義するにはどうすればよいですか?それも可能ですか?

10
Olivier Refalo

GraphQLクエリのルートでアクセス可能なフィールドは、GraphQLスキーマで、ルートクエリタイプのフィールドとして定義されます。通常は、単にQueryという名前が付けられます。このタイプは、スキーマ内の他のGraphQLオブジェクトタイプとまったく同じです。したがって、この質問は次のように言い換えることができます。

GraphQLフィールドには、渡された引数または引数タイプに基づいて異なる結果を返す機能がありますか?

簡単な答えは「いいえ」です。 GraphQLの重要な特性の1つは、特定のフィールドが常に同じ型を返す必要があることです。つまり、配列を返すフィールドは常に配列を返す必要があり、オブジェクトタイプを返すフィールドは、渡された引数に関係なく、常にその特定のタイプを返す必要があります。

ただし、あまりにも多くの異なる名前付きフィールドを作成する必要をなくすために、同様の結果を達成できる方法がいくつかあります。

  1. GraphQLフィールドには、オプションの引数を含めることができます。したがって、たとえばindividualsというフィールドがある場合、オプションの引数を使用して、さまざまな種類のフィルターを指定できます。たとえば、individuals(search: "Dan")またはindividuals(status: "admin")、またはindividuals(引数なし)またはindividuals(status: "admin", search: "Dan")(両方の引数が同時に提供されます。
  2. GraphQLフィールドは、いくつかのオブジェクトタイプの和集合を返すことができます。したがって、フィールドがいくつかの異なるタイプのものを返すことができる場合は、ユニオンを使用できます。これは、ドキュメントのSearchResultの例に示されています。 http://graphql.org/learn/schema/#union-types 残念ながら、ここでは、オブジェクトタイプの配列。

ただし、多くの場合、GraphQLには現在メソッドのオーバーロードや多形性がないため、複数のフィールドを作成する必要があります。

11
stubailo