graphql查询SQL父子关系

graphql查询SQL父子关系,graphql,graphql-js,Graphql,Graphql Js,我有一个postgres表,它表示具有父子表的层次结构: 表(类别): 预期结果: categories: [ { name: "CatA", children: [ { name: "CatC", children: [ { name: "CatE", children: [] }] }, {

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

表(类别):

预期结果:

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

 },
 {
       name: "CatB",
       children: []
 }
]
问题是我不知道有多少层,所以我无法查询以下内容:

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

实际上,您可以使用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
        }
    })
});
我得到了这个结果:


请注意,我将
字段
属性定义为函数,而不是普通对象。定义为对象的
字段
属性将失败,并且不允许您在字段中使用
categoryType
变量,因为在执行时它不存在

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

在SQL数据库之上使用GraphQL的困难之一是协调这两种范式。GraphQL是分层的。SQL数据库是关系数据库。两者之间并不总是有明确的对应关系


我们开源了一个框架,它以一种自以为是的方式设置您的模式。如果这样做,它会自动为您生成SQL查询。它的核心思想是关系。理论上,您可以在GraphQL查询中实现任意深度。

您好,这种方法需要使用查询。如果用户不知道孩子的深度是多少呢。我的问题是,这可以实现自动循环通过儿童吗?
fields: () => ({
   ...
})