如果过滤器变量为空,则GraphQL禁用过滤

时间:2018-06-26 16:38:41

标签: graphql graphql-js gatsby contentful

我有一个Gatsby GraphQL查询,用于按日期排序并按类别过滤的帖子列表。

{
  posts: allContentfulPost(
    sort: {fields: [date], order: DESC},
    filter: {category: {slug: {eq: $slug}}}
  ) {
    edges {
      node {
        title {
          title
        }
        date
      }
    }
  }
}

现在,当$slug是空字符串""时,我得到了

{
  "data": {
    "posts": null
  }
}

有没有办法获取所有帖子?

3 个答案:

答案 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