Как создать вложенные узлы в одну мутацию?

Привет, я пытаюсь записать данные на моем 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 мутации.

Другие вопросы по тегам