gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:24:47 26 4
gpt4 key购买 nike

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

什么是可能的

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

  • 按名称升序排序
  • ORDER BY name ASC, birthdate DESC, id ASC
  • ...等等

什么行不通

一张 map ,像这样:

排序:[{name: DESC, id: ASC}]

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

什么工作正常,但不理想

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

排序:[{name: DESC}, {id: ASC}]

每个映射代表一个输入对象,它有像 nameid 这样的字段,它们是具有可能值 ASC 的枚举降序我希望每个输入对象只填充一个字段。 ~但我不知道有什么方法可以强制执行。~

这很尴尬,因为:

  • 用户很容易将他们的排序参数打错为一张 map
  • 如果不将默认值添加到每个输入对象映射中,我无法指定默认值(如 ASC for id)

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


更新

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

最佳答案

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

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

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

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

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

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

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

关于GraphQL:接受排序参数的有序列表的惯用方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69180017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com