如何在一个请求中使用不同的参数多次运行一个突变?

时间:2018-06-16 16:10:38

标签: graphql apollo graphql-js react-apollo apollo-client

我有一个突变:

const createSomethingMutation = gql`
  mutation($data: SomethingCreateInput!) {
    createSomething(data: $data) {
      something {
        id
        name
      }
    }
  }
`;

如何在一个请求中创建多个Something?我是否需要在我的GraphQL服务器上创建一个新的Mutation,如下所示:

mutation {
  addManySomethings(data: [SomethingCreateInput]): [Something]
} 

或者有没有办法在一次请求中多次使用Apollo Client中现有的createSomethingMutation个不同的参数?

2 个答案:

答案 0 :(得分:5)

事实上,您可以使用别名执行此操作,并为每个别名分隔变量:

const createSomethingMutation = gql`
  mutation($dataA: SomethingCreateInput!) {
    createA: createSomething(data: $dataA) {
      something {
        id
        name
      }
    }
    createB: createSomething(data: $dataB) {
      something {
        id
        name
      }
    }
  }
`;

然后,您只需要提供一个包含两个属性的变量对象 - dataAdataB。但是,如果您需要突变的数量是动态的,那么事情会变得相当混乱。通常,在这种情况下,只需暴露单个突变来处理创建/更新模型的一个或多个实例,就可能更容易(也更有效)。

如果您尝试减少从客户端到服务器的网络请求数量,您还可以查看query batching

答案 1 :(得分:0)

这不可能那么容易。

因为变异具有一个一致的名称,并且graphql不允许在一个查询中多次执行相同的操作。因此,要实现这一点,Apollo必须将突变映射到别名,然后甚至将variables数据映射到一些未知的可迭代形式,我非常怀疑它。