【问题标题】:graphql query SQL parent child relationshipgraphql查询SQL父子关系
【发布时间】:2016-08-04 15:12:45
【问题描述】:

我有一个 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
       ...

【问题讨论】:

    标签: graphql graphql-js


    【解决方案1】:

    您实际上可以使用 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
            }
        })
    });
    

    我得到了这个结果:


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

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

    【讨论】:

    • 您好,这种方法需要使用查询。如果用户不知道孩子有多深怎么办。我的问题是这可以实现自动循环遍历孩子吗?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多