2016-11-12 103 views
1

我有三個不同的PostGres表,每個表都包含不同類型的同事。數據庫字段對於每種類型都不相同 - 這就是爲什麼它們位於三個不同的表中。Apollo GraphQL:查詢返回不同類型對象的模式?

我有一個組件可以訪問任何類型的關聯。現在看來,從我到目前爲止所遇到的例子,一個組件通常與一個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架構使得單個查詢,可以返回不同類型的對象?解析器可能會收到一個associateType參數,它會告訴它要引用哪個postGres表。但是模式是什麼樣子的,以便它可以根據需要返回類型爲associateAccountingType,associateArtDirectorType,associateAccountExecType等的對象?

在此先感謝所有的任何信息。

回答

4

您有兩種選擇。 聲明一個接口作爲返回的類型,並確保這些associateType中的每一個都擴展了該接口。如果您將所有這些類型的共同字段放在一起,這是一個好主意。 它看起來像這樣:

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類型。這個聲明要簡單得多,但要求你爲查詢的每個字段使用一個片段,因爲引擎假定這些類型沒有公共字段。

union associateType = associateAccountingType | associateArtDirectorType | associateAccountExecType 

一個更重要的事情將如何實現一個解析器會告訴你graphql服務器和客戶機是什麼實際的具體類型。阿波羅,你需要在工會/ interace型供應__resolveType功能:

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

此功能可以實現你想要的任何邏輯,但它必須返回你所使用的類型的名稱。 associate參數將是您從父解析器返回的實際對象。 context是您常用的上下文對象,info包含查詢和模式信息。

相關問題