2

我有一个查询

{
    "query": "query($withComments: Boolean!) {feed(id: 2) {name comments @include(if: $withComments) {title text}}}",
    "vars": {"withComments": true}
}

根据withComments变量,我可以抓取带有或不带有评论的提要。有用。但似乎桑格利亚汽酒无论如何都必须获得带有评论的提要(对我来说性能问题是什么),即使我不需要它们并传递withCommentsfalse

val QueryType = ObjectType(
    "Query",
    fields[GraphQLContext, Unit](
      Field("feed", OptionType(FeedType),
        arguments = Argument("id", IntType) :: Nil,
        resolve = c => c.ctx.feedRepository.get(c.arg[Int]("id")))))

什么是在对象中包含/排除继承列表(比如关系)的正确方法,如果我不从存储库中选择所有数据@include,让存储库知道它?

如果解决方案是进行两个查询feedfeedWithComments我看不到@include.

4

1 回答 1

1

由于您的数据访问对象(资源库)和 GraphQL 模式彼此分离,因此您需要明确传播有关特定字段的包含/排除的信息。

有很多方法可以解决这个问题,但我认为最简单的一种是使用projections。在您的情况下,它可能如下所示:

val IdArg = Argument("id", IntType)

val QueryType = ObjectType(
  "Query",
  fields[GraphQLContext, Unit](
    Field("feed", OptionType(FeedType),
      arguments = IdArg :: Nil,
      resolve = Projector(1, (c, projection) ⇒
        if (projection.exists(_.name == "comments"))
          c.ctx.feedRepository.getWithComments(c arg IdArg)
        else
          c.ctx.feedRepository.getWithoutComments(c arg IdArg)))))

Projector要求图书馆为我提供嵌套字段的 1 级深度投影(只是字段名称)。然后基于此信息,我可以以不同的方式获取数据(有或没有评论)

于 2018-03-10T16:50:02.507 回答