我有一个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
...
答案 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
}
})
});
我得到了这个结果:
请注意,我将field
属性定义为函数而不是普通对象。定义为对象的field
属性将失败,并且不允许您在字段中使用categoryType
变量,因为在执行时它不存在。
fields: () => ({
...
})
答案 1 :(得分:0)
在SQL数据库之上使用GraphQL的一个难点是协调这两个范例。 GraphQL是分层。 SQL数据库是关系。两者之间并不总是有明确的映射。
我们开源了一个框架Join Monster,它有一种固定的方式来设置你的模式。如果这样做,它会自动为您生成SQL查询。它建立在关系的核心理念之上。从理论上讲,您可以在GraphQL查询中实现任意深度。