如何在单次查询中填充Page类型的嵌套引用数组?
如何在Sanity中查询Page并填充嵌套的tile引用数据
嘿,这事儿用Sanity的GROQ查询就能搞定,核心是用->操作符来展开引用——因为你的tile嵌套在两层数组里(page.blocks[] → tileGrid.tiles[]),所以需要逐层处理引用展开。
我给你写个完整的查询示例,再拆解说明细节:
// 获取所有Page文档,也可以加过滤条件(比如slug)指定单个页面 *[_type == "page"] { // 先获取Page本身的基础字段 title, // 遍历blocks数组,逐个处理每个block blocks[] { // 保留每个block的类型标识,方便前端区分渲染 _type, // 只针对tileGrid类型的block,展开它的tiles引用 _type == "tileGrid" => { // 对tiles数组里的每个tile引用,用->拉取完整的tile文档数据 tiles[]->{ // 这里可以列出你需要的tile字段,或者用...获取所有字段 ..., // 如果tile还有其他嵌套引用(比如image是asset引用),也可以继续展开 // image->asset->url } }, // 其他类型的block(比如你说的otherType)直接保留所有原字段 _type != "tileGrid" => { ... } } }
关键细节说明:
->操作符:这是GROQ里展开引用的核心,它会把仅含_ref和_type的引用对象,替换成完整的目标文档数据。- 条件判断:用
_type == "tileGrid"精准处理特定类型的block,避免破坏其他类型blocks的数据结构。 - 字段控制:如果不需要tile的所有字段,可以明确列出需要的字段(比如
_id, title, description),减少返回数据量、提升性能。 - 单个页面查询:如果要查询特定页面,只需在过滤条件里加上slug判断,比如:
*[_type == "page" && slug.current == "about-us"] { // 后续结构和上面一致 }
举个更具体的场景:假设你的tile有title、description和image字段,查询可以写成:
*[_type == "page"] { title, blocks[] { _type, _type == "tileGrid" => { tiles[]->{ _id, title, description, image } }, ... } }
这样返回的Page数据里,blocks数组中所有tileGrid类型的元素,其tiles数组都会是完整的tile文档数据,而不是单纯的引用对象了。
内容的提问来源于stack exchange,提问作者Slem
相关产品推荐
相关产品推荐

