实体/集合的模式命名的最佳做法

时间:2019-12-04 11:01:41

标签: graphql apollo-client

我正在构建一个Graphql模式,并且徘徊了什么是返回类型的单个vs集合项的最佳实践。假设我们要检索users

一个选项(如果可能的话)将是这样的查询,其中ID是可选的,如果传递了ID,我们将返回单个项目,如果不是所有用户的集合,则< / p>

query {
  user (id: 1234) {
    name
  }
}

// return a single [User]
query {
  user (id: null) {
    name
  }
}

// return a collection [User,User,User,...]

另一种选择是拥有userusers

query {
  user (id: 1234) {
    name
  }
}

// return a single User
query {
  users {
    name
  }
}

// return a collection [User,User,User,...]

我想知道什么是最佳实践,或者您是否可以为我指明一些与之相关的资源以供阅读。

1 个答案:

答案 0 :(得分:0)

我正在使用单数和复数名词来命名分别返回单个对象和对象列表的查询字段。我认为这种命名方式对于大多数开发人员来说都是很自然的。

因此,要返回一个用户,就是:

type Query {
   user(id:Int!) : User
}

它总是返回一个用户。只需将id输入参数设置为强制性,以使其不能接受NULL

要返回用户列表,通常是:

type Query {
   users : [User]
}

但是,如果它可以有许多用户,则很可能需要考虑使用分页之类的方法,以使开发人员可以逐页获取用户。对于基于偏移量的分页,我正在执行以下操作:

type Query {
   users(offset:Int limit:Int) : UserPage
}

type UserPage {
   data     : [User]
   pageInfo : PageInfo
}

type PageInfo {

    # When paginating forwards, are there more items?
    hasNextPage    : Boolean!

    # When paginating backwards, are there more items?
    hasPreviousPage: Boolean!

    # Total number of records in all page
    total : Long
}

根据要求,您可以考虑将orderByfilter输入参数添加到users查询字段中,以向开发人员提供更多选项来获取结果集,他们有兴趣。

如果要以基于光标的分页样式返回用户列表,可以查看Relay Specification