GraphQL 中的嵌套排序



我正在使用Contentful作为CMS,其中我有内容模型"类别"和"子类别"。每个子类别都有一个类别作为其父类别。这两个模型都有一个名为order的属性,我在 CMS 中设置了该属性,以确定它们在导航中的显示顺序。

这是我的 GraphQL 查询:

query {
allContentfulCategory(sort: {fields: [order, subcategory___order]}) {
edges {
node {
order
title
subcategory {
order
title
}
}
}
}
}

第一个排序工作正常,查询按顺序字段输出我的类别,而不是反向创建顺序,这似乎是 Contentful 的默认输出(最新类别首先显示(。

但是,我的第二种subcategory___order,受到这篇博文的启发,并没有评估。换句话说,子类别(每个类别(以相反的顺序显示,以便顶部项目的顺序为 8,并减少到 7 和 6,依此类推。

例如,假设我的类别"动物"顺序为 2,类别"树木"顺序为 1。我的内容按逆向创建顺序排列:"猫"(顺序 3(、"狗"(顺序 1(、"鸡"(顺序 2(、"桦树"(顺序 2(、"橡树"(顺序 3(和"柳树"(顺序 1(。

这些将通过查询,如下所示:

Trees (1):
Birch (2)
Oak (3)
Willow (1)
Animals (2):
Cat (3)
Dog (1)
Chicken (2)

我找不到一种方法让 GraphQL 查询同时执行两个排序命令,以便我的数据根据我在 CMS 中设置的顺序进行排序。

提前非常感谢!

编辑:这是一个组件解决方案:

在来自我的查询的每个类别节点中,我可以访问数组中的子类别及其顺序。

const categories = data.allContentfulCategory.edges
{categories.map((category) => {
return (
<div>
{category.node.subcategory && category.node.subcategory.sort((a, b) => {return a.order - b.order}).map((subcategory) => {
return (
<div>
<p>{subcategory.title}</p>
</div>
)
})}
</div>
)
})}

这里的关键元素是我如何按组件中的子类别顺序对数组进行排序:

category.node.subcategory.sort((a, b) => {return a.order - b.order})

需要明确的是,这不是一个令人满意的解决方案,也没有回答我关于如何编写多个 GraphQL 排序的问题。但是这段代码确实在组织子类别方面做了我想要的。

您查询的是category而不是subcategory

query {
allContentfulCategory(sort: {fields: [order, subcategory___order]}) {
edges {
node {
order
title
subcategory {
order
title
}
}
}
}
}

在上面的查询中,仅对返回的数组data.allContentfulCategory.edges进行排序。盖茨比不会对嵌套在category.subcategory中的数据进行排序。

此外,您指定的第二个字段(subcategory___order(只有在第一个字段(order(相同时才会被考虑。由于每个类别都有唯一的顺序,因此永远不会使用subcategory

如果可以查询类似allContentfulSubcategory的内容,它将起作用。

否则,您可以改用createSchemaCustomization将排序逻辑移动到构建时间。我不知道您的架构是什么样子的,所以这只是一个例子:

// gatsby-node.js
exports.createSchemaCustomization = ({ actions, schema }) => {
const { createTypes } = actions
const typeDefs = [
schema.buildObjectType({
name: "ContentfulCategory",
fields: {
subcategory: {
type: "[ContentfulSubcategory]",
resolve: (src) => {
const subcategories = src.subcategory
return subcategories.sort()
}
},
},
interfaces: ["Node"],
extensions: { infer: true },
}),
]
createTypes(typeDefs)
}

如果您需要使用createSchemaCustomization,请参阅此处有关该主题的 Gatsby 文档。

文档的信息可能会让人不知所措,我也在这里写了一些关于这个 API 的文章。它更多的是关于字段扩展,但解析器功能基本相同。

最新更新