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

时间:2019-01-16 17:58:26

标签: graphql prisma

我正在使用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
  }
}

我收到此错误:

  

“消息”:“变量\” $ _ v0_data \“的值无效   {\“ dateToDo \”:\“ cjqycv9dtjklr09179y9zfntq \”,\“内容\”:\“新   task \“,\” completed \“:false};预期的类型   DayCreateOneWithoutTasksInput设为value.dateToDo处的对象。“,

我的问题是:我在突变解析器中正确使用connect吗?到底是DayCreateOneWithoutTasksInput是什么(我看到它自动添加到了pyramida.graphql中),以及如何使用它来创建与Day的ID有关系的Task?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

schema explorer in the playground

希望有帮助!