7

嗨,我正在尝试在我的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
}

例如,我想在一个突变中同时创建一家新公司、它的新所有者和多个地址。对于地址,我还需要创建一个新联系人。

4

1 回答 1

19

您可以使用我们所谓的嵌套突变来实现这一点。首先,让我们看看我们如何在 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 客户端,我们使用 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!]取决于多重性(一对一;对多)、相关模型CompanyUserCompanyAddress)和相关字段owneraddresses)的组合。当您导航到createCompany突变时,您可以在 GraphiQL 游乐场文档中找到所有类型名称。

于 2017-02-09T10:44:47.953 回答