danhemerlein
danhemerlein

Reputation: 93

Create mutation between related types in GraphQL

I'm using GraphQL to try to create a record that has a relation to another type. The types are Task and Day

datamodel.graphql:

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

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

I want to create a task so that it has a reference of the date it should be completed (from the Day type)

schema.graphql

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

my mutation resolver looks like this:

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;
  },

when I run this mutation to create the task:

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

I get this error:

"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.",

My questions are: Am I using connect correctly in the mutation resolver? And what the heck is DayCreateOneWithoutTasksInput (I see its been automagically added in prisma.graphql) and how do I use it to create a Task that has a relation to a Day's ID?

Upvotes: 2

Views: 893

Answers (1)

Matthias Oertel
Matthias Oertel

Reputation: 889

The mutation to create the task has the following shape:

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

The type DayCreateOneWithoutTasksInput Prisma is asking for is autogenerated and is the one expected for the field dataToDo. The name means that Prisma would accept a type that creates one Day node but does not have the field tasks or a type that specifies a connection. The WithoutTasksInput part states is there because the type can only be used nested in a mutation where you start from a task, Prisma therefore already has the value to fill in for the tasks field on the nested Day node and you do not need to specify it if you create the day instead of connecting an existing one.

If you use the Playground you can explore the schema that contains all the types on the right side.

schema explorer in the playground

Hope that helps!

Upvotes: 3

Related Questions