首页 文章

有嵌套突变的Graphql?

提问于
浏览
1

我试图找出如何使用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 变异中添加地点信息?

2 回答

  • 7

    如果要将整个对象添加到突变中,则必须定义输入类型的graphql元素 . 这是一个小cheatsheet的链接 .

    在你的情况下,它可能看起来像这样:

    `
    type Event {
        id: String
        name: String
        description: String
        place: Place
    }
    
    type Place {
        id: String
        name: String
        location: Location
    }
    
    input PlaceInput {
        id: ID!
        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, place: PlaceInput!): Event
    }
    
    schema {
        query: Query
        mutation: Mutation
    }
    `
    
  • 2

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

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

    一个变异基本上只是一个函数调用,并且它提供一个事件并期望它返回一个事件,你提供创建一个事件所需的信息 .

相关问题