在 GraphQL 中的相关类型之间创建突变

Posted

技术标签:

【中文标题】在 GraphQL 中的相关类型之间创建突变【英文标题】:Create mutation between related types in GraphQL 【发布时间】:2019-06-10 21:03:42 【问题描述】:

我正在使用 GraphQL 尝试创建与另一种类型相关的记录。类型为任务和日期

datamodel.graphql:

type Task 
  id: ID! @unique
  content: String!
  completed: Boolean!
  dateToDo: Day!


type Day 
  id: ID! @unique
  content: String!
  tasks: [Task]

我想创建一个任务,以便它具有应该完成的日期的参考(来自 Day 类型)

schema.graphql

type Mutation 
  createTask(content: String!, completed: Boolean!, dateToDo: ID! ): Task!

我的变异解析器如下所示:

const Mutations = 
  async createTask(parent, args, ctx, info) 

    const task = await ctx.db.mutation.createTask(
      
        data: 
          dateToDo: 
            connect: 
              id: args.dateToDo
            
          ,
          ...args
        
      ,
      info
    );

    return task;
  ,

当我运行这个突变来创建任务时:

mutation CREATE_ONE_TASK  
  createTask(
    content: "a new task",
    completed: false,
    dateToDo: "cjqycv9dtjklr09179y9zfntq") 
  
    id
  

我得到这个错误:

"message": "变量\"$_v0_data\" 得到无效值 \"dateToDo\":\"cjqycv9dtjklr09179y9zfntq\",\"内容\":\"一个新的 task\",\"completed\":false; 预期类型 DayCreateOneWithoutTasksInput 成为 value.dateToDo 处的对象。",

我的问题是:我是否在突变解析器中正确使用了连接? DayCreateOneWithoutTasksInput 到底是什么(我看到它已自动添加到 prisma.graphql 中),我如何使用它来创建与 Day 的 ID 相关的任务?

【问题讨论】:

【参考方案1】:

创建任务的突变具有以下形状:

mutation b 
  createTask(
    data: 
      content: "Task1"
      completed: false
      dateToDo:  connect:  id: "cjqzjvk6w000e0999a75mzwpx"  
    
  ) 
    id
  

Prisma 要求的类型 DayCreateOneWithoutTasksInput 是自动生成的,并且是字段 dataToDo 所期望的类型。该名称意味着 Prisma 将接受创建一个 Day 节点但没有字段任务或指定连接的类型的类型。 WithoutTasksInput 部分状态在那里,因为该类型只能嵌套在从任务开始的突变中使用,因此 Prisma 已经具有要填写嵌套 Day 节点上的任务字段的值,而您没有如果您创建一天而不是连接现有的一天,则需要指定它。

如果您使用 Playground,您可以探索包含右侧所有类型的架构。

schema explorer in the playground

希望对您有所帮助!

【讨论】:

非常感谢 Matthias,这个解决方案对我有用。也谢谢你的解释!

以上是关于在 GraphQL 中的相关类型之间创建突变的主要内容,如果未能解决你的问题,请参考以下文章

从另一个突变中调用 GraphQL 突变?

Prisma、GraphQL 和 Apollo 中具有突变的数据关系和连接类型

GraphQL 突变中的子类型

突变中的 GraphQL 描述性成功消息

GraphQL 突变中的自定义类型

突变中的 GraphQL 嵌套数据