具有嵌套突变的 Graphql?

Graphql with nested mutations?

如果可能的话,我正在尝试弄清楚如何使用 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
}

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

如果您想将整个对象添加到突变中,您必须定义输入类型的 graphql 元素。这里有一个link到一个小cheatsheet.

在你的情况下它可能是这样的:

    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
    }

一般来说,您应该避免将变更的参数视为到架构中对象类型的直接映射。虽然它们确实经常相似,但您最好在它们不会相似的假设下处理事物。

以您的基本类型为例。假设我想创建一个新事件,但不知道位置,我只有 longitude/latitude - 它实际上是后端根据此数据计算真实位置对象,我当然不知道它的 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
)

突变基本上只是一个函数调用,最好从这些方面来考虑它。如果您编写了一个函数来创建事件,您可能不会向它提供事件并期望它 return 事件,您会提供创建事件所需的 信息.