graphql查询SQL父子关系

时间:2016-08-04 15:12:45

标签: graphql graphql-js

我有一个postgres表,表示具有父子表的层次结构:

表(类别):

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 个答案:

答案 0 :(得分: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: () => ({
   ...
})

答案 1 :(得分:0)

在SQL数据库之上使用GraphQL的一个难点是协调这两个范例。 GraphQL是分层。 SQL数据库是关系。两者之间并不总是有明确的映射。

我们开源了一个框架Join Monster,它有一种固定的方式来设置你的模式。如果这样做,它会自动为您生成SQL查询。它建立在关系的核心理念之上。从理论上讲,您可以在GraphQL查询中实现任意深度。