Как создать вложенные узлы в одну мутацию?
Привет, я пытаюсь записать данные на моем https://www.graph.cool/ db с мутацией. Мой проект - это веб-приложение React, и я использую Apollo в качестве клиента graphql и пакет npm graphql-tag в качестве синтаксического анализатора литералов шаблонов.
Проблема в том, что я не знаю, как расположить строку шаблона 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
}
Например, я хочу создать новую компанию, ее нового владельца и несколько адресов одновременно в одной мутации. Для адресов мне нужно создать новый контакт, а также.
1 ответ
Вы можете использовать наши так называемые вложенные мутации для достижения этой цели. Прежде всего, давайте посмотрим, как мы можем сделать это с игровой площадки 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!]
зависит от комбинации множественности (к одному; ко многим), связанных моделей (Company
а также User
; Company
а также Address
) и связанные поля (owner
; addresses
). Вы можете найти все имена типов в документации игровой площадки GraphiQL при переходе к createCompany
мутации.