2016-08-04 99 views
0

我有一個Postgres的表表示與父子表層次:graphql查詢SQL父子關係

表(類別):

id name parentId 
1 CatA null 
2 CatB null 
3 CatC 1 
4 CatD 1 
5 CatE 3 

期望的結果:

categories: 
[ 
    { 
     name: "CatA", 
     children: [ 
     { 
     name: "CatC", 
     children: [ 
     { 
      name: "CatE", 
      children: [] 
     }] 
     }, 
     { 
     name: "CatD", 
     children: [] 
     } 
    ], 

}, 
{ 
     name: "CatB", 
     children: [] 
} 
] 

問題是,我不知道有多少級別,所以我不能像這樣查詢:

category { 
    name 
    parent { 
    name 
    parent { 
     name 
     ... 

回答

2

您實際上可以通過GraphQL實現潛在的無限遞歸。所以它不介意你是否不知道你的模式有多深。

我能夠用這個模式重現你想要的結果。我希望它可能幫助你:

const categories = [ 
    { 
     name: 'CatA', 
     children: [ 
      { 
       name: 'CatC', 
       children: [ 
        { 
         name: 'CatE', 
         children: [] 
        }] 
      }, 
      { 
       name: 'CatD', 
       children: [] 
      } 
     ] 
    }, 
    { 
     name: 'CatB', 
     children: [] 
    } 
]; 

const categoryType = new GraphQLObjectType({ 
    name: 'CategoryType', 
    fields:() => ({ 
     name: { type: GraphQLString }, 
     children: { type: new GraphQLList(categoryType) } 
    }) 
}); 

const queryType = new GraphQLObjectType({ 
    name: 'RootQuery', 
    fields:() => ({ 
     categories: { 
      type: new GraphQLList(categoryType), 
      resolve:() => categories 
     } 
    }) 
}); 

而且我得到了這樣的結果:

enter image description here


請注意,我定義field財產作爲功能,而不是一個簡單的對象。定義爲對象的field屬性將失敗,並且不允許您在字段中使用categoryType變量,因爲在執行期間它不存在。

fields:() => ({ 
    ... 
}) 
+0

嗨,這種方法需要使用查詢。如果用戶不知道孩子有多深,該怎麼辦?我的問題是,這可以實現自動循環通過孩子嗎? – XxXk5XxX

0

在SQL數據庫之上使用GraphQL的困難之一是協調兩個範例。 GraphQL是分層。 SQL數據庫是關係。兩者之間並不總是有明確的映射關係。

我們開源了一個框架,Join Monster,它具有建立模式的獨特方式。如果這樣做,它會自動爲您生成SQL查詢。它的核心思想是關係。從理論上講,您可以在GraphQL查詢中實現任意深度。