【问题标题】:GraphQL: idiomatic way to accept an ordered list of sort parameters?GraphQL:接受排序参数的有序列表的惯用方式?
【发布时间】:2021-11-09 18:28:15
【问题描述】:

我正在构建一个 GraphQL API。我希望允许用户使用多种排序来指定记录的排序方式。

什么应该是可能的

如果我公开了按namebirthdateidmonsters 进行排序的功能,用户应该能够让API 按这些的任意组合进行排序,包括(在SQL 术语中):

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

什么不起作用

一张地图,像这样:

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

...不会告诉我应用排序的顺序(地图是无序的)。

什么可行,但不理想

目前,我接受地图列表,如下所示:

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

每个映射代表一个输入对象,它具有nameid 等字段,它们是具有可能值ASCDESC 的枚举。 我希望每个输入对象只填写一个字段。 〜但我不知道如何强制执行。〜

这很尴尬,因为:

  • 用户很容易将排序参数输入为单个映射
  • 如果不将默认值添加到每个输入对象映射中,我无法指定默认值(例如 ASC for id

有没有更惯用的方式来接受排序参数的有序列表?


更新

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

【问题讨论】:

  • 我看到其他人(stackoverflow.com/a/58971399/4376)建议了orderBy: {fields: [COMMENT, CREATED_AT], order: [ASC, DESC]},但是IMO这更尴尬,因为fieldsorder相互依赖,很容易搞砸,提供错误的 order 参数数量或顺序。
  • 请记住,GraphQL API 最擅长解决的问题可能不是 SQL 服务器最擅长解决的问题。人们普遍认为“GraphQL 应该只是一个公共 SQL API”,但这条路通向地狱。 :)
  • @conny 点了。但我并不是要让用户能够做任何事情。对于排序,我指定在每种记录类型上哪些列是可排序的。但我不认为用户能够按多个排序是不合理的。当然还有其他示例,其中元组的有序列表将成为有用的 API 输入。
  • 如果输入对象上的联合类型是可能的,我们可以说“排序是monster_sortss 的列表,每个都是name_sortage_sort 或@ 987654343@"

标签: graphql


【解决方案1】:

我认为简短的回答是“不”。

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

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

但这也“只是一个约定”。您列出非理想的“地图列表”(“对象数组”)模型可能是此时的最佳选择:

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

但是,无论您选择哪种方式,都要避免开始手动破解这些东西的诱惑 - 您的服务器代码会因为这种横切关注而变得复杂,您的架构也是如此。

相反,我看到一些 GraphQL 到 ORM 的桥接库使用 Directives 来控制运行时模式生成 (one example of this)。这应该比这种手工雕刻的东西更可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2018-10-23
    • 1970-01-01
    相关资源
    最近更新 更多