获取指定对象的边及单查询实现Post上下篇导航的技术问询
问题解答
1. 获取给定对象的边
在GraphQL的Connection模式里,边(Edge)一般包含cursor(游标)和对应的node(节点对象)。要拿到特定对象的边,核心思路是先精准定位目标对象,再请求它所在连接的edges字段就行。举个实际例子,假设你要找ID为指定值的Post对应的边,可以这么写查询:
query GetTargetPostEdge($targetPostId: ID!) { allPosts(filter: { id: $targetPostId }) { edges { cursor # 边的游标信息 node { id title createdAt content } } } }
这里通过filter匹配目标Post的ID,然后从edges里提取对应的边数据。当然具体的筛选字段、连接名称要和你的实际Schema对应,核心逻辑是通用的。
2. 单个查询获取当前Post的上一篇和下一篇
你之前尝试同时用after和before确实走不通,因为GraphQL Connection规范里这两个参数是互斥的。要实现上下篇导航,我们可以用查询别名把两个独立的筛选查询合并成一个请求,一次拿到结果。
假设你的Post是按createdAt(发布时间)排序来区分上下篇,查询可以这么写:
query GetPrevNextPosts($currentId: ID!, $currentCreatedAt: DateTime!) { # 下一篇:比当前Post发布时间晚的第一个,排除当前Post本身 nextPost: allPosts( first: 1 filter: { createdAt: { gt: $currentCreatedAt } id: { ne: $currentId } } orderBy: createdAt_ASC ) { id title } # 上一篇:比当前Post发布时间早的最后一个,排除当前Post本身 prevPost: allPosts( last: 1 filter: { createdAt: { lt: $currentCreatedAt } id: { ne: $currentId } } orderBy: createdAt_ASC ) { id title } }
逻辑说明:
- 用
nextPost和prevPost作为别名,把两个查询结果合并在一个响应里,实现“单个查询”的需求 - 通过
createdAt的gt(大于)和lt(小于)筛选出时间前后的Post - 加上
id: { ne: $currentId }避免拿到当前Post本身 - 前端拿到结果后,如果
prevPost为空就隐藏上一篇箭头,nextPost为空就隐藏下一篇箭头,刚好适配导航功能
如果你的排序规则不是createdAt(比如按更新时间updatedAt),只需要把createdAt换成对应的字段就行,逻辑完全通用。
内容的提问来源于stack exchange,提问作者Patrick.SE
相关产品推荐
相关产品推荐

