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

时间:2017-02-09 09:56:17

标签: graphql react-apollo apollo-client graphcool

您好我正在尝试使用变异在我的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
}

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

1 个答案:

答案 0 :(得分:13)

您可以使用我们所谓的嵌套突变来实现这一目标。 首先,让我们看看我们如何从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),相关模型(CompanyUser; CompanyAddress)和相关字段owner; addresses) 。导航到createCompany突变时,您可以在GraphiQL playground文档中找到所有类型名称。