我有一个Gatsby GraphQL查询,用于按日期排序并按类别过滤的帖子列表。
{
posts: allContentfulPost(
sort: {fields: [date], order: DESC},
filter: {category: {slug: {eq: $slug}}}
) {
edges {
node {
title {
title
}
date
}
}
}
}
现在,当$slug
是空字符串""
时,我得到了
{
"data": {
"posts": null
}
}
有没有办法获取所有帖子?
答案 0 :(得分:2)
您可以使用正则表达式过滤器来发挥自己的优势。如果您传递一个空表达式,则将返回所有帖子,因为所有内容都将匹配。
query Posts($slugRegex: String = "//"){
posts: allContentfulPost(
sort: {fields: [date], order: DESC},
filter: {category: {slug: {eq: $slugRegex}}}
) {
# Rest of the query.
}
}
默认情况下,将返回所有帖子(如果未传递任何内容,则$slugRegex
是一个空的正则表达式)。当$slugRegex
成为有意义的表达式时,将仅显示匹配的帖子。
关于传递值,我假设您正在使用gatsby-node.js
创建页面。然后就这么简单:
// gatsby-node.js
exports.createPages = async ({ actions }) => {
const { createPage } = actions
// Create a page with only "some-slug" posts.
createPage({
// ...
context: {
slugRegex: "/some-slug/"
}
})
// Create a page with all posts.
createPage({
// ...
context: {
// Nothing here. Or at least no `slugRegex`.
}
})
}
答案 1 :(得分:1)
此查询是不可能的,即使@ skip / @ include指令也无济于事,因为您不能将其应用于输入字段。
我建议您调整服务器端逻辑,以使“ eq”字段中的null会忽略此过滤器,或者编辑正在发送的查询(不太理想的imo)。
您似乎要使用的graphql模式缺少所需的过滤支持。
答案 2 :(得分:0)
如果有人需要针对 Gatsby 以外的其他系统的解决方案,则可以使用 @skip
和 @include
来实现。
fragment EventSearchResult on EventsConnection {
edges {
cursor
node {
id
name
}
}
totalCount
}
query Events($organizationId: UUID!, $isSearch: Boolean!, $search: String!) {
events(condition: { organizationId: $organizationId }, first: 100)
@skip(if: $isSearch) {
...EventSearchResult
}
eventsSearch: events(
condition: { organizationId: $organizationId }
filter: { name: { likeInsensitive: $search } }
first: 100
) @include(if: $isSearch) {
...EventSearchResult
}
}
然后在您的客户端代码中,您将为查询提供 search 和 isSearch 并获取您的事件,例如:
const events = data.eventsSearch || data.events