next.js 健康GROQ:如何获取文档中引用数组的草稿?

xwbd5t1u  于 2023-04-20  发布在  其他
关注(0)|答案(2)|浏览(110)

我有一个文档类型page,它包含一个blocks数组,这些数组是对其他对象类型的引用。当我获取page文档的数据时,它返回文档的草稿数据,但不返回数组中的引用。我写了这样的查询,它返回文档的草稿和非草稿数据:

*[_type == "page" && slug.current == "${querySlug === '/' ? 'home' : querySlug}"] {
  _id,
  title,
  description,
  showSubNav,
  subNavigation[] -> {slug, title},
  blocks[] -> {
    ...,
    heroCardBlock -> {...},
    oneColumnContent -> {...},
    featuredNews -> {...},
    newsCategories[] -> {...},
    newsList[] -> {..., selectedCategory -> {...}},
    caseStudiesListSource[] -> {...},
  }
}

这将返回page文档的草稿和非草稿数据,草稿可用于未引用的块,例如标题、描述、showSubNav等,但对于subNavigation和块数组(引用其他对象类型的数组),草稿数据不会返回,查询中仅返回已发布的数据。
我的桌面结构是这样的:Sanity Desk Structure
我如何获得这些参考的草稿数据?

06odsfpq

06odsfpq1#

解引用操作符(->)将始终只返回已发布的内容。要获取草稿内容,您需要使用子查询(并且查询必须经过身份验证,但如果您获取的是page类型的草稿,则必须如此)。
考虑一个更简单的例子可能是最简单的,然后你可以扩展到更大的查询。如果我们考虑这个:

*[_type == "page"] {
  _id,
  title,
  blocks[]->{
    heroCardBlock->,
  }
}

我希望你能取回已发表的heroCardBlock参考文献。这个修订版应该强调取回已发表的参考文献和草稿参考文献之间的区别:

*[_type == "page"] {
  _id,
  title,
  blocks[]->{
    'published': heroCardBlock->,
    'draft': *[_type == '<HERO_CARD_BLOCK_TYPE>' && _id in path('drafts.' + ^.^.heroCardBlock._ref)][0]
  }
}

我不知道<HERO_CARD_BLOCK_TYPE>是什么,但你需要指定它来帮助使这个查询更有效。需要双插入符号(^.^.)来遍历两次到适当的范围。需要[0]是因为draft子查询将返回一个数组,即使它总是只有一个文档;指定此值会导致publisheddraft被格式化为相同的格式。

66bbxpm5

66bbxpm52#

根据Geoff Ball的回答和本页:https://www.sanity.io/schemas/fetch-the-draft-or-published-version-of-a-document-Pb0aymVu0PGBy9kYL3Azh
我们可以这样做

*[_type == "page"] {
  ...,
  blocks[]{...coalesce(*[_id == 'drafts.' + ^._ref][0], *[_id == ^._ref][0])}
}

它看起来像下面的结果,但首选草稿

*[_type == "page"] {
  ...,
  blocks[]->
}

您甚至可以在->[0])}之后使用{... }语法!

相关问题