【问题标题】:Add an array of Objects to a mutation in apollo-react将对象数组添加到 apollo-react 中的突变
【发布时间】:2017-12-28 10:48:50
【问题描述】:

我在前端使用 react-apollo,在后端使用 graphcool。我有一个突变,可以创建这样的教程:

const CREATE_TUTORIAL_MUTATION = gql`
  mutation CreateTutorialMutation(
    $author: String
    $link: String
    $title: String!
    $postedById: ID!
    $completed: Boolean!
  ) {
    createTutorial(
      author: $author
      link: $link
      title: $title
      postedById: $postedById
      completed: $completed
    ) {
      author
      link
      title
      postedBy {
        id
        name
      }
      completed
    }
  }
`

它在提交处理程序中被调用...

this.props.createTutorialMutation({
      variables: {
        author,
        link,
        title,
        completed: false,
        postedById
      }
    })

一切都很好。

现在我想在创建新教程时添加一组标签。我创建了输入字段并将其连接起来,以便 tags 变量是一个对象数组,每个对象都有一个标签 id 和标签 text

如果我尝试将标签字段添加到突变中,它需要一个标量类型。但是对象数组似乎没有标量类型。

如果我在调用突变时将标记变量作为参数传递,我如何填写突变中的标量类型字段(此处为第 148 行 https://github.com/joshpitzalis/path/blob/graphQL/src/components/Add.js)和模式?

我是 graphQL 的新手,我知道我可能以完全错误的方式处理这个问题。如果是这种情况,如何将对象数组添加到 graphQL 中的突变?

【问题讨论】:

    标签: reactjs graphql apollo graphcool


    【解决方案1】:

    您应该在架构文件中添加一个新的 Tag 类型,并使用新关系将其连接到 Tutorial

    type Tutorial {
      author: String
      completed: Boolean
      link: String
      title: String!
      id: ID! @isUnique
      createdAt: DateTime!
      updatedAt: DateTime!
      postedBy: User @relation(name: "UsersTutorials")
      tags: [Tag!]! @relation(name: "TutorialTags")
    }
    
    type Tag {
      id: ID!
      tag: String!
      number: Int!
      tutorials: [Tutorial!]! @relation(name: "TutorialTags")
    }
    

    然后您可以使用嵌套的创建突变创建一个新教程和新标签,如下所示:

    const CREATE_TUTORIAL_MUTATION = gql`
      mutation CreateTutorialMutation(
        $author: String
        $link: String
        $title: String!
        $tags: [TutorialtagsTag!]!
        $completed: Boolean!
        $postedById: ID!
      ) {
        createTutorial(
          author: $author
          link: $link
          title: $title
          tags: $tags
          completed: $completed
          postedById: $postedById
        ) {
          author
          link
          title
          postedBy {
            id
            name
          }
          completed
          tags {
            id
            text
          }
        }
      }
    `
    

    这篇文章提供了有关其他方法及其权衡取舍的更多背景信息:https://www.graph.cool/forum/t/how-do-i-add-an-array-of-objects-to-a-mutation-in-apollo-react/365/6?u=nilan

    【讨论】:

    • 嘿伙计,你能帮我一个大忙,看看我刚刚发布的一个问题。我想我需要将@relation 添加到帖子和镜头模式中。我对 Apollo 很陌生,所以可能是一个愚蠢的问题:但我可以简单地将我的客户端模式与我的服务器模式区分开来,只要它们匹配吗?因为我的服务器不知道“@relation”是什么。当我开始添加本地模式以与服务器交互时,我的客户似乎不喜欢它:即使它们匹配 stackoverflow.com/questions/62113955/…
    【解决方案2】:

    我对您的要求的理解是,如果您有以下代码

    const user = {
        name:"Rohit", 
        age:27, 
        marks: [10,15], 
        subjects:[
            {name:"maths"},
            {name:"science"}
        ]
    };
    
    const query = `mutation {
            createUser(user:${user}) {
                name
            }
    }`
    

    你一定会得到类似的东西

    "mutation {
            createUser(user:[object Object]) {
                name
            }
    }"
    

    而不是预期的

    "mutation {
            createUser(user:{
                name: "Rohit" ,
                age: 27 ,
                marks: [10 ,15 ] ,
                subjects: [
                    {name: "maths" } ,
                    {name: "science" } 
                    ] 
                }) {
                name
            }
    }"
    

    如果这是您想要实现的,那么gqlast 是一个不错的标签功能,您可以使用它来获得预期的结果

    只需从here 中获取 js 文件并将其用作:

    const user = {
        name:"Rohit", 
        age:27, 
        marks: [10,15], 
        subjects:[
            {name:"maths"},
            {name:"science"}
        ]
    };
    
    const query = gqlast`mutation {
            createUser(user:${user}) {
                name
            }
    }`
    

    存储在变量query 中的结果将是:

    "mutation {
            createUser(user:{
                name: "Rohit" ,
                age: 27 ,
                marks: [10 ,15 ] ,
                subjects: [
                    {name: "maths" } ,
                    {name: "science" } 
                    ] 
                }) {
                name
            }
    }"
    

    【讨论】:

    • 这对我的情况真的很有效,非常感谢你,对于任何有需要的人来说,基本的一件事就是使用gql''YOUR GQLASTSTRING'',因为这将生成文档节点。赞!!
    猜你喜欢
    • 2021-09-18
    • 2020-09-18
    • 2020-02-03
    • 2020-06-21
    • 2020-05-10
    • 2017-02-07
    • 2020-05-18
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多