如何在一个突变中创建嵌套节点?

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 和列表对象参数 addressesaddresses 有一个嵌套的 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), 相关模型CompanyUserCompanyAddress)和相关字段owneraddresses)。当您导航到 createCompany 突变时,您可以在 GraphiQL playground 文档中找到所有类型名称。