2016-11-12 6 views
1

私は3つの異なるPostGresテーブルを持っています。それぞれに異なるタイプのアソシエートが含まれています。データベースフィールドは各タイプごとに異なります。そのため、3つのテーブルに分けられています。Apollo GraphQL:異なるタイプのオブジェクトを返すクエリのスキーマ?

私は潜在的に任意のタイプのアソシエートにアクセスできる1つのコンポーネントを持っています。

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クエリことを、ただ一つのを返すことができます表示されます。今では、コンポーネントは通常例えば、1つのGraphQLクエリに関連付けられていることを、私がこれまでに遭遇した例かららしいですレコードのと入力します。スキーマ内:

getOneAssociate(associateType: String): [associateAccountingType] 

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

事前にすべての情報に感謝します。

答えて

4

ここには2つのオプションがあります。 戻り値の型としてInterfaceを宣言し、これらの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 

もう一つ重要なことは、実際の具体的なタイプが何であるか、あなたのgraphqlサーバーとクライアントを教えてくれますリゾルバを実装する方法になります。アポロのために、あなたは組合/ interaceタイプに__resolveType機能を提供する必要があります。

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

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

関連する問題