我正在使用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 的文章。它更多的是关于字段扩展,但解析器功能基本相同。