Sanity io 按作者显示博客文章

Sanity io show blog posts by author

我正在学习 Sanity io CMS 和 GROQ。我使用一种 Sanity 预定义博客模式构建了一个简单的博客。我已经设法显示 posts,单个 post 和作者页面,显示名称、图像和个人简介。

我想做的是在他的页面中显示属于作者的博客 post 的列表。在 posts 模式中有对作者的引用:

{
  name: 'author',
  title: 'Author',
  type: 'reference',
  to: {type: 'author'},
},

我尝试在 Author 模式中添加对 post 的数组引用,但结果是在 CMS 中我需要手动向作者添加 posts。同时,我想查询作者和 return 属于作者的 posts 因为在 posts 模式中有对它的引用,但找不到如何做.它可能更多是 GROQ 查询而不是架构问题,还是两者兼而有之?

通过查看 Query Cheat Sheet 页面中的 Sanity 文档,我自己找到了答案。这不是方案问题,而是 GROQ 查询问题。在作者页面中,在显示作者简介等的查询中。我添加了另一部分,我在其中查询该作者的 posts:

// GROQ Query
sanityClient
  .fetch(
    `*[_type == "author"]{
      name,
      bio,
      "authorImage": image.asset->url,
      "posts": *[_type == "post" && author._ref in *[_type=="author" && name == name ]._id ]{
        title,
        "slug": slug.current,
      }
  }`
  )
  .then((data) => setAuthor(data[0]))
  .catch(console.error);

然后我可以简单地映射“posts”,使用“slug”将 URL 构建为单个 post。

{author.posts &&
  author.posts.map((p) => {
    return (
      <li>
        <a href={`/post/${p.slug}`}>{p.title}</a>
      </li>
    );                  
   })
}

如果你想通过他的帖子联系到作者,你可以这样做:

*[_type == "post"]{
  _id,
  title,
  author->{ // here to reach author name and image you should type ->
  name,
  image
},
description,
mainImage,
slug
}