GraphQL:接受排序参数的有序列表的惯用方法?



我正在构建一个GraphQL API。我想允许用户指定记录应该如何排序,使用多种排序。

什么是可能的

如果我公开了按namebirthdateid排序monsters的能力,用户应该能够让API按这些的任何组合排序,包括(在SQL术语中):

  • ORDER BY name ASC
  • ORDER BY name ASC, birthdate DESC, id ASC
  • …等

什么不行

单个映射,像这样:

sorts: [{name: DESC, id: ASC}]

…不会告诉我排序应用的顺序(映射是无序的)。

什么工作正常,但不是理想的

目前,我接受一个映射列表,像这样:

sorts: [{name: DESC}, {id: ASC}]

每个map代表一个输入对象,它有像nameid这样的字段,它们是可能值为ASCDESC的枚举。我希望每个输入对象只填充一个字段。~但我不知道如何强制执行~

这很尴尬,因为:

  • 用户很容易将他们的排序参数输入为单个地图
  • 我不能指定一个默认值(如ASCid),没有它添加到每个输入对象映射

是否有更习惯的方式来接受排序参数的有序列表?


更新我现在添加了一个面向用户的解释性错误,当每个map有多个键时。有了这个改变,我认为这个策略是可以的,但是如果将来有更好的方法出现,我仍然很高兴。

我想简短的回答是"不"。

长答:可以在启动时自省类型,并根据一些约定动态生成模式,使用自定义标量表示排序指令,例如:

monsters(sortBy: [name___ASC, birthdate___DESC, id___ASC]) { name }

但这也是"只是一种惯例"。"地图列表"("数组的对象")模型,您列出了一个非理想的可能是最好的选择在这一点上:

# the query
monsters( 
sortBy: [
{name: asc},
{birthdate: desc_nulls_last},
{id: asc}
]
) {
name
}

但是,无论你选择哪种方式,都要避免手动修改这些东西的诱惑——你的服务器代码会因为这个横切问题而变得复杂,你的模式也是如此。

相反,我看到一些graphql到orm的桥接库使用指令来控制运行时模式的生成(其中一个例子)。应该是much比手工雕刻更可行。

最新更新