You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Gatsby中用GraphQL实现关联(Join)查询?附Netlify CMS配置

在Gatsby中实现Netlify CMS关联内容的GraphQL Join查询

嘿,我来帮你搞定这个关联查询的问题!结合你的Netlify CMS配置,我们可以分几步实现Gatsby里的关联查询:

1. 先完善Netlify CMS的Relation配置

你当前的relation配置不完整,需要指定关联的集合、显示字段等,这样Netlify CMS才能正确把posts和tags关联起来,存下正确的关联值:

- label: "Posts"
  name: "posts"
  folder: "src/data/posts"
  create: true
  slug: "{{slug}}"
  fields:
    - {label: "Id", name: "title", widget: "string"}
    - label: "Tags"
      name: "tags"
      widget: "list"
      fields:
        - label: "Tag"
          name: "tag"
          widget: "relation"
          collection: "tags" # 指定关联的tags集合
          displayFields: ["title"] # 后台选择时显示的字段
          searchFields: ["title", "description"] # 搜索时用到的字段
          valueField: "title" # 存储到posts文件里的字段值(这里用tag的title)

2. 确保Gatsby能读取并解析你的数据文件

在gatsby-config.js里配置文件系统源和解析器,让Gatsby能读取src/data/tags和src/data/posts里的文件:

module.exports = {
  plugins: [
    // 读取tags文件夹
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `tags`,
        path: `${__dirname}/src/data/tags`,
      },
    },
    // 读取posts文件夹
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `posts`,
        path: `${__dirname}/src/data/posts`,
      },
    },
    // 解析YAML文件(如果你的内容是YAML格式的话)
    `gatsby-transformer-yaml`,
    // 如果是Markdown格式,换成gatsby-transformer-remark
    // `gatsby-transformer-remark`,
  ],
};

3. 自定义GraphQL Schema建立关联

Gatsby默认不会自动识别Netlify CMS的关联关系,所以我们需要在gatsby-node.js里自定义Schema,用@link指令手动建立posts和tags的关联:

exports.createSchemaCustomization = ({ actions }) => {
  const { createTypes } = actions;
  const typeDefs = `
    # 定义Posts的类型,关联tags
    type PostsYaml implements Node {
      tags: [PostsYamlTags]
    }
    # 定义Posts里的tags子项,关联对应的Tag数据
    type PostsYamlTags {
      tag: String
      # 通过tag的title关联到TagsYaml
      tagData: TagsYaml @link(from: "tag" by: "title")
    }
    # 定义Tags的类型
    type TagsYaml implements Node {
      title: String
      description: String
    }
  `;
  createTypes(typeDefs);
};

这里的核心是@link(from: "tag" by: "title"),它告诉Gatsby:把PostsYamlTags里的tag字段值,和TagsYaml里的title字段匹配,从而关联到对应的tag详情。

4. 编写关联查询获取数据

现在你就可以写GraphQL查询,一次性获取posts和它们对应的tag详情了:

query GetAllPostsWithTags {
  allPostsYaml {
    nodes {
      title # 文章标题
      tags {
        tagData {
          title # 标签名称
          description # 标签描述
        }
      }
    }
  }
}

这个查询会返回所有文章,每篇文章下都会包含它关联的所有标签的完整信息。

如果你的数据是Markdown格式,只需要把上面的PostsYaml和TagsYaml换成MarkdownRemark,并调整对应的字段路径即可。

内容的提问来源于stack exchange,提问作者deemaagog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:48:57