フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

GraphQL interfaceとunionsについて

はじめに

GraphQL仕様では、2つの抽象型を使用できる。抽象型を使用すると、GraphQLスキーマの設計が大幅に改善され、クエリとミューテーションが簡素化される。

  • interface
  • unions

インターフェースとは?

  • 対応するインターフェイスを実装するオブジェクトまたはクラスに特定のプロパティを適用する構造です
  • インターフェイスで定義されたプロパティに準拠する必要があるオブジェクトの特定のグループにアクセスする場合に通常必要であり。インターフェイスでは、基本的に型のグループを抽象化している。この抽象化により、それらを1つのエンティティとして推論できる。
type Company{
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime
  name: String
  staffs: [Staff]
  departments: [Department]
}
type Staff {
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime
  name: String
}
type Department
{
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime
  name: String
}
  • 基本的にはタイプの上に「ノード」を追加して、1つのエンティティとしてアクセスできるになる。 「Node」と呼ばれる単一のエンティティとしてスキーマからすべてのタイプにアクセスできる

f:id:PX-WING:20200825092115p:plain

カスタムNodeインターフェースの実装

  • すべてのインターフェースを少なくとも1つのフィールドで定義する必要がある
  • 通常、すべてのタイプはインターフェースとして機能し、IDフィールドがある。
interface Node {
  id: ID!
}
  • Nodeインターフェースの共通構造を変更して、タイムスタンプとなるcreatedAtおよびupdatedAtを追加する。
interface Node {
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime
}
  • インターフェイスを定義すると、インターフェイスのすべての子が持つ必要があるフィールドを指定する必要があります。 インターフェイスを定義したら、この特定のインターフェイスを実装するタイプを選択する必要がある。
  • インターフェースによって実装されたすべてのタイプは、共通のID、createdAtおよびupdatedAtフィールドを指定する必要がある。共通フィールドも、型に対して明示的に書き込む必要があり、そうでない場合、GraphQLスキーマは無効になる。
type Company{
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime
  name: String
  staffs: [Staff]
  departments: [Department]
}
type Staff {
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime
  name: String
}
type Department
{
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime
  name: String
}

union

  • 子タイプの検証に制限されたくない場合に利用する。フィールドを共有する必要がない複数のタイプを表現したい場合など。 下記の場合、StaffとDepartmentのみを検索できるという制約になる。
union Search = Staff| Department