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

Create mutation between related types in GraphQL

我正在使用 GraphQL 尝试创建与另一种类型相关的记录。类型是 Task 和 Day

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": "Variable \"$_v0_data\" got invalid value {\"dateToDo\":\"cjqycv9dtjklr09179y9zfntq\",\"content\":\"a new task\",\"completed\":false}; Expected type DayCreateOneWithoutTasksInput to be an object at value.dateToDo.",

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

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

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

希望对您有所帮助!