如何在一个突变中创建嵌套节点?
How to create nested nodes in one mutation?
您好,我正在尝试将数据写入我的 https://www.graph.cool/ 数据库并进行修改。
我的项目是一个 React 网络应用程序,我使用 Apollo 作为 graphql 客户端,使用 graphql-tag npm 包作为模板文字解析器。
问题是我不知道如何安排 gql 模板字符串以使用嵌套数据进行正确的修改。
我的架构看起来像这样,例如注意类型 "Company" 的字段 "Addresses" 是 "Address" 对象类型的数组。
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
}
例如,我想在一次变更中同时创建一家新公司、它的新所有者和多个地址。对于地址,我也需要创建一个新联系人。
您可以使用我们所谓的嵌套突变来实现这一点。
首先,让我们看看如何从 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 文档中找到所有类型名称。
您好,我正在尝试将数据写入我的 https://www.graph.cool/ 数据库并进行修改。 我的项目是一个 React 网络应用程序,我使用 Apollo 作为 graphql 客户端,使用 graphql-tag npm 包作为模板文字解析器。
问题是我不知道如何安排 gql 模板字符串以使用嵌套数据进行正确的修改。 我的架构看起来像这样,例如注意类型 "Company" 的字段 "Addresses" 是 "Address" 对象类型的数组。
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
}
例如,我想在一次变更中同时创建一家新公司、它的新所有者和多个地址。对于地址,我也需要创建一个新联系人。
您可以使用我们所谓的嵌套突变来实现这一点。 首先,让我们看看如何从 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 文档中找到所有类型名称。