在GraphQL中,如何“聚合”属性

时间:2018-10-02 03:39:16

标签: graphql apollo

不好意思的代码,我真的不能复制/粘贴。 :)

我这样输入GraphQL:

type Thing {
    toBe: Boolean
    orNot: Boolean
}

我正在尝试为此类型创建一个新属性,这是这两个属性的...总和。基本上基于这些值返回一个新值。代码如下:

if (this.toBe && !this.orNot) { return "To be!"; }
if (!this.toBe && !this.orNot) { return "OrNot!"; }

这有意义吗?因此它将返回类似的内容:

Thing1 {
    toBe: true;
    orNot: false;
    newProp: "To be!"
}

2 个答案:

答案 0 :(得分:2)

是的,您可以通过处理聚合字段Object types中所需的逻辑,轻松地在graphql resolver中创建聚合字段。在创建对象类型时,您拥有该对象的实例,因此,您可以使用对象的数据轻松创建汇总字段,这些字段在域模型中不存在,并且 这是其中之一graphql的美丽 。请注意,这在GraphQL库的每种实现上可能有所不同。以下是JavaScriptScala中此类用例的示例。

  

Graphql.js中的示例:

var FooType = new GraphQLObjectType({
  name: 'Foo',
  fields: {
    toBe: { type: GraphQLBoolean},
    orNot: { type: GraphQLBoolean},
    newProp: { type: GraphQLString,
    resolve(obj) {
        if (obj.toBe && !obj.orNot) { return "To be!"; }
        else { return "OrNot!"; }
    }
  }
});
  

Sangria-graphql中的示例:

ObjectType(
    "Foo",
    "graphql object type for foo",
    fields[Unit, Foo](
      Field("toBe",BooleanType,resolve = _.value.name),
      Field("orNot",BooleanType,resolve = _.value.path),
      Field("newProp",StringType,resolve = c => {
          if (c.value.toBe && !c.value.orNot) "To be!" else "OrNot!"
      })
    )
  )

答案 1 :(得分:0)

各种GraphQL服务器库实现都具有提供解析器功能的方法,这些功能可以为字段提供值。您必须将其包含在架构中并为其编写代码,但这是合理的做法,引用的代码是一个很好的起点。

特别是在Apollo中,您pass a map of resolvers作为resolvers:选项传递给ApolloServer构造函数。如果字段没有解析器,则默认为从本地JavaScript对象返回相关字段。所以你可以写

const resolvers = {
  Thing: {
    newProp: (parent) => {
      if (parent.toBe && !parent.orNot) { return "To be!"; }
      if (!parent.toBe && !parent.orNot) { return "OrNot!"; }
      return "That is the question";
    }
  }
};