我有一个文档类型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])}
之后的}
语法!