Graphql react-apollo的动态变异文档

Graphql react-apollo的动态变异文档,graphql,react-apollo,apollo-client,Graphql,React Apollo,Apollo Client,我需要动态更改我的突变文档,以便能够在一个突变中创建多个项目。因此,我有一个函数createOrderName,它接受一个整数并能够创建正确的文档。例如,createOrderName(2)get mutation createOrderMut($input0: AddToOrderMenuItemConnectionInput!, $input1: AddToOrderMenuItemConnectionInput!) { input0: addToOrderMenuItemConnect

我需要动态更改我的突变文档,以便能够在一个突变中创建多个项目。因此,我有一个函数
createOrderName
,它接受一个整数并能够创建正确的文档。例如,
createOrderName(2)
get

mutation createOrderMut($input0: AddToOrderMenuItemConnectionInput!, $input1: AddToOrderMenuItemConnectionInput!) {
  input0: addToOrderMenuItemConnection (input:$input0) {
    changedOrderMenuItem {
      id
    }
  }
  input1: addToOrderMenuItemConnection (input:$input1) {
    changedOrderMenuItem {
      id
    }
  }
}
我的容器如下

const CartContainer = compose(
  graphql(createOrderName(2), {
    props: ({ mutate }) => ({
      addToOrderMenuItem: (menus, orderId) => mutate({
        variables: createOrdersInput(menus, orderId)
      })
    })
  })
)(CartView)

现在,我如何将整数值传递给这个变异,以便它创建正确的变异文档?目前它被修改为2,但我需要它更灵活,以便我可以创建任意数量的项…

我不确定是否可以用您当前的实现回答您的问题,因此我将敦促您重新考虑您的突变定义,并使用
GraphQList
GraphQLInputObject

因此,根据需要变异的字段:

args: {
  input: {
    type: new GraphQLList(new GraphQLInputObjectType({
      name: 'inputObject',
      description: 'Your description here',
      fields: {
        id: { type: GraphQLInt }
      },
    })),
  },
},
通过这种方式,您可以在mutate调用中提供n个对象,并获得有关您的类型的列表:

{
  mutation myMutation {
    addToOrderMenuItemConnection(input: [{ id: 123 }, { id: 456 }]) {
      id
    }
  }
}

再说一次,我对您的最终目标不是100%熟悉,但我认为这将为您提供未来更改/更新的灵活性,因为您处理的是对象输入,而不是单个参数,这也(希望如此)将您与未来的破坏性更改隔离。

这听起来像是您正在使用的后端的一个不幸限制。进行批处理变异的正确方法是在服务器上有一个变异字段,该字段接受包含所有要插入项的列表参数。因此,Apollo的设计不支持使用标准的
react Apollo
API生成这种动态查询。这是因为我们坚信使用静态查询比在运行时生成字段要好得多:

不过,在这种情况下,动态生成变异字符串似乎是一个不错的选择。您可以直接使用Apollo而不是通过
graphql
HoC来实现这一点。您可以使用阿波罗HoC来执行以下操作:

从'react apollo'导入{withApollo};
常量MyComponent=({client})=>{
函数mutate(){
const dynamicMutationString=//在此处生成变异字符串
变异({
突变:gql`${dynamicMutationString}`,
变量:{…},
}).然后(…);
}
返回点击这里;
}
const MyComponent with Apollo=with Apollo(MyComponent);
我们构建这个额外的API就是为了这个目的——当标准的东西还不够的时候


以下是
mutate
btw:

为什么不为每个订单发送一个单独的变异请求?这在时间上太昂贵了,例如,如果有一个包含500个项目的订单,需要500个网络呼叫。然而,这只需一次网络事务即可完成。我认为在这种情况下,您应该使用阿波罗
来使用
客户端。直接修改
,并动态生成查询字符串。谢谢。我不知道有
图形列表
。我会尝试一下,然后再给你回复。谢谢你的评论。这实际上是服务器端的事情。我在问客户方。我无法控制服务器端,因为我使用的是GraphQL服务。无论如何,谢谢。这是正确的答案,也许服务可以为您添加它?我知道他们会对这样的请求做出很好的响应。
import { withApollo } from 'react-apollo';

const MyComponent = ({ client }) => {
  function mutate() {
    const dynamicMutationString = // generate mutation string here

    client.mutate({
      mutation: gql`${dynamicMutationString}`,
      variables: { ... },
    }).then(...);
  }

  return <button onClick={mutate}>Click here</button>;
}

const MyComponentWithApollo = withApollo(MyComponent);