1

3 つの異なる PostGres テーブルがあり、それぞれに異なるタイプのアソシエートが含まれています。データベース フィールドはタイプごとに異なります。そのため、これらは 3 つの別々のテーブルにあります。

あらゆるタイプのアソシエイトにアクセスできる可能性のあるコンポーネントが 1 つあります。これまでに遭遇した例から、コンポーネントは通常、1 つの GraphQL クエリに関連付けられているようです。

const withData = graphql(GETONEASSOCIATE_QUERY, {
    options({ navID }) {
        return {
            variables: { _id: navID}
        };
    }
    ,
    props({ data: { loading, getOneAssociate } }) {
        return { loading, getOneAssociate };
    },


});

export default compose(
    withData,
    withApollo
)(AssociatesList);

また、特定の GraphQL クエリは、たとえばスキーマ内の単一のタイプのレコードのみを返すことができるようです。

getOneAssociate(associateType: String): [associateAccountingType]

質問:単一のクエリが異なるタイプのオブジェクトを返すことができるように、GraphQL スキーマを設計することは可能ですか? リゾルバーは、どの postGres テーブルを参照するかを伝える AssociateType パラメーターを受け取ることができます。しかし、必要に応じて、associateAccountingType、associateArtDirectorType、associateAccountExecType などのタイプのオブジェクトを返すことができるようにするには、スキーマはどのようになるでしょうか?

情報をお寄せいただきありがとうございます。

4

1 に答える 1

5

ここには 2 つのオプションがあります。返される型としてインターフェイスを宣言し、これらの各 AssociateTypes がそのインターフェイスを拡張していることを確認します。これは、これらすべてのタイプに共通のフィールドを一緒に持つ場合に適しています。次のようになります。

interface associateType {
  id: ID
  department: Department
  employees: [Employee]
}

type associateAccountingType implements associateType {
  id: ID
  department: Department
  employees: [Employee]
  accounts: [Account]
}

type associateArtDirectorType implements associateType {
  id: ID
  department: Department
  employees: [Employee]
  projects: [Project]
}

共通のフィールドがない場合、または何らかの理由でこれらのタイプを無関係にしたい場合は、共用体タイプを使用できます。この宣言ははるかに単純ですが、クエリを実行するフィールドごとにフラグメントを使用する必要があります。これは、エンジンがこれらの型に共通のフィールドがないと想定しているためです。

union associateType = associateAccountingType | associateArtDirectorType | associateAccountExecType

もう 1 つ重要なことは、graphql サーバーとクライアントに実際の具象型を伝えるリゾルバーを実装する方法です。apollo の場合、union/interace タイプで __resolveType 関数を提供する必要があります。

{
  associateType: {
    __resolveType(associate, context, info) {
      return associate.isAccounting ? 'associateAccountingType' : 'associateArtDirectorType';
    },
  }
},

この関数は、任意のロジックを実装できますが、使用している型の名前を返す必要があります。associate引数は、親リゾルバーから返された実際のオブジェクトになります。context通常のコンテキスト オブジェクトでありinfo、クエリとスキーマ情報を保持します。

于 2016-11-23T08:58:14.483 に答える