Sanity GROQ:如何获取文档中引用数组的草稿



我有一个文档类型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等,但对于作为其他对象类型引用数组的子导航和块数组,不返回草稿数据,只在查询中返回已发布数据。

我的智能办公桌结构是这样的:Sanity办公桌结构

如何获取这些引用的草稿数据?

解引用运算符(->)将始终只返回已发布的内容。要获取草稿内容,您需要使用子查询(并且查询必须经过身份验证,但如果您要获取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子查询将返回一个数组,即使它总是只有一个文档;指定这一点使得CCD_ 12和CCD_。

基于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])}之后的}语法!

相关内容

  • 没有找到相关文章

最新更新