我正在构建一个GraphQL API。我想允许用户指定记录应该如何排序,使用多种排序。
什么是可能的
如果我公开了按name
、birthdate
和id
排序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代表一个输入对象,它有像name
和id
这样的字段,它们是可能值为ASC
和DESC
的枚举。我希望每个输入对象只填充一个字段。~但我不知道如何强制执行~
这很尴尬,因为:
- 用户很容易将他们的排序参数输入为单个地图
- 我不能指定一个默认值(如
ASC
为id
),没有它添加到每个输入对象映射
是否有更习惯的方式来接受排序参数的有序列表?
更新我现在添加了一个面向用户的解释性错误,当每个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比手工雕刻更可行。