具有嵌套突变的 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 事件,您会提供创建事件所需的 信息.
如果可能的话,我正在尝试弄清楚如何使用 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 事件,您会提供创建事件所需的 信息.