【问题标题】:Gatsby.js: Filter GraphQL query by nested object propertyGatsby.js:按嵌套对象属性过滤 GraphQL 查询
【发布时间】:2018-07-09 23:32:13
【问题描述】:

我在一个新闻网站上工作,该网站将有文章,每篇文章都有一个或多个各自的作者。如果您单击作者的姓名,它将带您进入一个页面,显示他们的信息和他们贡献的文章列表。

所以每篇文章都有一个authors 属性,而该属性又是一个author 对象数组,其属性为:全名、slug(全名的小写版本,空格替换为破折号)等。

在定义查询时是否可以按特定作者的 slug 过滤文章?

query authorQuery($slug: String!) {
  allContentfulArticle(filter: { //not sure what to do here }) {
    edges {
      node {
        title
        slug
        authors {
          name
          slug
        }
      }
    }
  }
}

我的另一个选择是加载所有文章,然后在组件中设置一个过滤器,如下所示:

const articles = data.allContentfulArticle.edges.filter(({ node }) => {
  return node.authors.some((author) => author.slug === data.contentfulAuthor.slug);
});

这不会是世界末日,但它违反了 GraphQL 只加载您需要的数据的原则。

【问题讨论】:

    标签: filter graphql graphql-js contentful gatsby


    【解决方案1】:

    如果我理解正确,您想在这里实现什么,您想按作者对文章进行分组。 如果您查询并将过滤器应用于allContentfulAuthor,您可以实现这一点 并请求article 字段,如下所示:

    {
      allContentfulAuthor(filter: {slug: {eq: "myslug"}}) {
        edges {
          node {
            name
            article {
              title
              slug
            }
          }
        }
      }
    }
    

    请注意,article 名称是您文章的 contentTypeId。

    【讨论】:

    • 如果作者没有文章字段,这会起作用吗?
    • 谢谢哈立德!我没有意识到作者对象会自动包含一个文章字段,因为我将关系定义为包含作者的文章,反之亦然。是什么造成了这种魔力,Contentful 本身?很酷。要回答您的问题@LukeFlournoy,答案似乎是肯定的:)
    • 这是作者对文章的回调引用,与 Contentful 无关,它更像是 GraphQl 魔法
    • 再次感谢,每天都越来越喜欢graphql。一个与嵌套相关的快速后续问题:是否也可以在此处按字段对文章进行排序?在你上面的例子中的意思是article(sort:{fields:[date], order:DESC}) { title slug }
    • 它可以工作,你可以在 localhost:8000/___graphql 上测试,Gatsbyjs 在开发模式下为你生成一个 grapgiql 服务器,这是你最好的朋友
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 2023-01-30
    • 2021-05-09
    • 2022-12-14
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多