您好我正在尝试使用变异在我的https://www.graph.cool/数据库上写入数据。 我的项目是一个React网络应用程序,我使用Apollo作为graphql客户端和graphql-tag npm包作为模板文字解析器。
问题是我不知道如何使用嵌套数据为正确的变异安排gql模板字符串。 我的模式如下所示,例如,注意“公司”类型的“地址”字段是“地址”对象类型的数组。
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
}
例如,我想在一个变异中同时创建一个新公司,它的新所有者和多个地址。对于我需要创建新联系人的地址。
答案 0 :(得分:13)
您可以使用我们所谓的嵌套突变来实现这一目标。 首先,让我们看看我们如何从GraphiQL游乐场做到这一点:
mutation createNestedCompany {
createCompany(
owner: {
name: "Mickey"
email: "mickey@mouse.com"
}
addresses: [{
street: "A street"
city: "A city"
country: "A country"
contacts: [{
name: "Mickey"
email: "mickey@mouse.com"
phone: "+1 23456789"
}]
}, {
street: "B street"
city: "B city"
country: "B country"
contacts: [{
name: "Minney"
email: "minney@mouse.com"
phone: "+9 87654321"
}]
}]
) {
id
owner {
id
}
addresses {
id
contacts {
id
}
}
}
}
请注意,createCompany
变异具有对象参数owner
和列表对象参数addresses
。 addresses
有一个嵌套的contacts
列表对象参数。
使用Apollo Client,我们使用GraphQL变量指定输入参数,所以让我们看看它在这种情况下的外观:
const createNestedCompany = gql`
mutation createNestedCompany(
$owner: CompanyownerUser
$addresses: [CompanyaddressesAddress!]
) {
createCompany(
owner: $owner
addresses: $addresses
) {
id
owner {
id
}
addresses {
id
contacts {
id
}
}
}
}
`
当用Apollo调用变异时,我们现在必须将变量指定为对象:
const variables = {
owner: {
name: "Mickey"
email: "mickey@mouse.com"
},
addresses: [{
street: "A street"
city: "A city"
country: "A country"
contacts: [{
name: "Mickey"
email: "mickey@mouse.com"
phone: "+1 23456789"
}]
}, {
street: "A street"
city: "A city"
country: "A country"
contacts: [{
name: "Minney"
email: "minney@mouse.com"
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!]
取决于多重性(to-one; to-many),相关模型(Company
和User
; Company
和Address
)和相关字段(owner
; addresses
) 。导航到createCompany
突变时,您可以在GraphiQL playground文档中找到所有类型名称。