问题描述
我正在尝试在我的 https://www.graph.cool/ db 上写入数据一个突变.我的项目是一个 React 网络应用程序,我使用 Apollo 作为 graphql 客户端,使用 graphql-tag npm 包作为模板文字解析器.
Hi I am trying to write data on my https://www.graph.cool/ db with a mutation.My project is a React web-app and I am using Apollo as graphql client and graphql-tag npm package as template literal parser.
问题是我不知道如何安排 gql 模板字符串以使用嵌套数据进行正确的突变.我的架构看起来像这样,例如注意公司"类型的地址"字段是地址"对象类型的数组.
The problem is that i don't know how to arrange the gql template string for the correct mutation with nested data.My schema looks like this, for example note the field "Addresses" for the type "Company" is an array of "Address" objects type.
type Company {
name: String!
website: String
Owner: User
Addresses: [Addresses]
}
type User {
name: String!
email: String
}
type Address {
street: String!
city: String!
country: String
contacts: [Contact]
}
type Contact {
name: String
email: String
phone: String
}
例如,我想在一次变更中同时创建一家新公司、其新所有者和多个地址.对于地址,我还需要创建一个新联系人.
For example, I want to create a new company, its new owner and multiple addresses at the same time in one mutation. For the addresses I need to create a new contact as well.
推荐答案
您可以使用我们所谓的嵌套突变来实现这一点.首先,让我们看看我们如何从 GraphiQL playground 做到这一点:
You can make use our so called nested mutations to accomplish that.First of all, let's see how we can do it from the GraphiQL playground:
mutation createNestedCompany {
createCompany(
owner: {
name: "Mickey"
email: "[email protected]"
}
addresses: [{
street: "A street"
city: "A city"
country: "A country"
contacts: [{
name: "Mickey"
email: "[email protected]"
phone: "+1 23456789"
}]
}, {
street: "B street"
city: "B city"
country: "B country"
contacts: [{
name: "Minney"
email: "[email protected]"
phone: "+9 87654321"
}]
}]
) {
id
owner {
id
}
addresses {
id
contacts {
id
}
}
}
}
请注意,createCompany
突变具有对象参数 owner
和列表对象参数 addresses
.addresses
有一个嵌套的 contacts
列表对象参数.
Note that the createCompany
mutation has the object argument owner
and the list object argument addresses
. addresses
has a nested contacts
list object argument.
使用 Apollo Client,我们使用 GraphQL 变量指定输入参数,让我们看看它在这种情况下的样子:
Using Apollo Client, we specify input arguments with GraphQL variables, so let's see how it looks in this case:
const createNestedCompany = gql`
mutation createNestedCompany(
$owner: CompanyownerUser
$addresses: [CompanyaddressesAddress!]
) {
createCompany(
owner: $owner
addresses: $addresses
) {
id
owner {
id
}
addresses {
id
contacts {
id
}
}
}
}
`
当使用 Apollo 调用突变时,我们现在必须将变量指定为对象:
When calling the mutation with Apollo, we now have to specify the variables as an object:
const variables = {
owner: {
name: "Mickey"
email: "[email protected]"
},
addresses: [{
street: "A street"
city: "A city"
country: "A country"
contacts: [{
name: "Mickey"
email: "[email protected]"
phone: "+1 23456789"
}]
}, {
street: "A street"
city: "A city"
country: "A country"
contacts: [{
name: "Minney"
email: "[email protected]"
phone: "+9 87654321"
}]
}]
}
并用变量调用变异:
this.props.createNestedCompany({ variables })
.then((response) => {
console.log('Company, owner and addresses plus contacts created');
}).catch((e) => {
console.error(e)
})
变量类型CompanyownerUser
和[CompanyaddressesAddress!]
取决于多重性(一对一;对多)的组合,相关模型(Company
和User
;Company
和Address
)和相关字段(owner
;addresses
).当您导航到 createCompany
突变时,您可以在 GraphiQL 游乐场文档中找到所有类型名称.
The variable types CompanyownerUser
and [CompanyaddressesAddress!]
depend on a combination of the multiplicity (to-one; to-many), the related models (Company
and User
; Company
and Address
) and the related fields (owner
; addresses
). You can find all type names in the GraphiQL playground docs when you navigate to the createCompany
mutation.
这篇关于如何在一个突变中创建嵌套节点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!