有嵌套突变的Graphql?

jsa*_*san 2 graphql graphql-js

我试图找出如何使用graphql突变变异嵌套对象,如果可能的话.例如,我有以下架构:

type Event {
    id: String
    name: String
    description: String
    place: Place
}

type Place {
    id: String
    name: String
    location: Location
}

type Location {
    city: String
    country: String
    zip: String
}

type Query {
    events: [Event]
}

type Mutation {
    updateEvent(id: String, name: String, description: String): Event
}

schema {
    query: Query
    mutation: Mutation
}
Run Code Online (Sandbox Code Playgroud)

如何在我的updateEvent变异中添加地点信息?

And*_*ram 12

一般来说,您应该避免将突变的参数视为模式中对象类型的直接映射.虽然它们通常是相似的,但你最好在不假设它们的情况下接近它们.

以您的基本类型为例.假设我想创建一个新事件,但不是知道位置,而是我只有经度/纬度 - 它实际上是从这个数据计算真实位置对象的后端,我当然不知道它的ID(它还没有!).我可能会像这样构建我的变异:

input Point {
  longitude: Float!
  latitude: Float!
}

input PlaceInput {
  name
  coordinates: Point!
}

type mutation {
  createEvent(
    name: String!
    description: String
    placeId: ID
    newPlace: PlaceInput
  ): Event  
  updateEvent(
    id: ID!
    name: String!
    description: String
    placeId: ID
    newPlace: PlaceInput
  ): Event
)
Run Code Online (Sandbox Code Playgroud)

变异基本上只是一个函数调用,最好用这些术语来考虑它.如果您编写了一个函数来创建一个事件,您可能不会为它提供一个事件并期望它返回一个事件,您将提供创建事件所需信息.


Loc*_*0_0 8

如果要将整个对象添加到突变中,则必须定义类型为 input 的 graphql 元素。这是一个小备忘单的链接。

在您的情况下,它可能如下所示:

`
type Location {
    city: String
    country: String
    zip: String
}

type Place {
    id: String
    name: String
    location: Location
}

type Event {
    id: String
    name: String
    description: String
    place: Place
}

input LocationInput {
   city: String
   country: String
   zip: String
}

input PlaceInput {
    id: ID!
    name: String!
    location: LocationInput!
}

type Query {
    events: [Event]
}

type Mutation {
    updateEvent(id: String, name: String, description: String, place: PlaceInput!): Event
}

schema {
    query: Query
    mutation: Mutation
}
`
Run Code Online (Sandbox Code Playgroud)