Pagination 为什么继电器+图形QL连接中没有“位置”参数?

Pagination 为什么继电器+图形QL连接中没有“位置”参数?,pagination,graphql,relayjs,Pagination,Graphql,Relayjs,GraphQL和Relay有一个健壮的分页算法,可以为最终用户轻松分页,甚至在无边界和顺序无关的结果中也可以分页 然而,我有一个用例,我真的不确定如何在GraphQL和relay中进行操作,而且很容易我确定我错过了一些东西 例如,如果我的列表是按orderBy参数排序的,那么如何获取第5项和仅获取第5项?如果后端有一个有序列表,并且希望获取特定位置的元素,只需将位置值指定为查询字段的参数。查询字段的代码如下所示: employee: { type: EmployeeType, args:

GraphQL和Relay有一个健壮的分页算法,可以为最终用户轻松分页,甚至在无边界和顺序无关的结果中也可以分页

然而,我有一个用例,我真的不确定如何在GraphQL和relay中进行操作,而且很容易我确定我错过了一些东西


例如,如果我的列表是按orderBy参数排序的,那么如何获取第5项和仅获取第5项?

如果后端有一个有序列表,并且希望获取特定位置的元素,只需将位置值指定为查询字段的参数。查询字段的代码如下所示:

employee: {
  type: EmployeeType,
  args: {
    position: {
      type: new GraphQLNonNull(GraphQLInt)
    },
    ...args,
  },
  resolve: async (context, {position, ...args}) => {
    // Get the ordered list of employees, probably from cache.
    // Pick the employee with the requested position in the list.
    // Return the employee.
  },
},

这并没有很好的文档记录,但这里介绍了如何做到这一点

query {
  allPeople(first: 5, last: 1) {
    edges {
      node {
        name
      }
    }
  }
}
首先,选择First:5以获取列表中的前5个人。然后,执行last:1,它从该子集中获取最后一个人。换句话说,找第五个人

如果你先做:5,最后做:2,你会得到列表中的第四和第五个人


如果返回错误-请在查询中手动重新键入单词query,它将正常工作。然后,在没有“第一个”和“最后一个”的情况下再试一次,以查看整个列表,您将看到Leia排名第五。

尽管这听起来有点像黑客攻击,但连接规范的当前形式仍然存在。这比Facebook最初的内部GraphQL实现的表现要宽松一些,后者拒绝将“第一个”和“最后一个”一起使用,认为这是无效的。@wincent,我不这么认为。你能解释一下吗?该链接显示了如何在有光标的情况下执行此操作。OP希望在没有光标的情况下获取第N项。请看第4.3节:它描述了有光标和无光标的行为。还表示,强烈建议不要同时为first和last包含一个值,因为这可能会导致混淆查询和结果。所以,买主注意……这也是一种合法的方法。类似的常见模式是创建一个find参数,用于从连接中选择单个项。还请注意,游标和ID都是不透明的,因此您可以定义所需的任何行为和内部实现细节,然后使用/滥用它们。例如,如果您想实现基于限制/偏移量的分页模型,可以将偏移量烘焙到游标中,这样您就可以先执行:$cursor类型查询后执行:1,动态生成适当的游标。显然,这会破坏封装,因此请少用。