Warm tip: This article is reproduced from stackoverflow.com, please click
graphql laravel laravel-lighthouse

Laravel Lighthouse Graphql belongsToMany mutation with pivot values

发布于 2020-04-07 10:23:57

I have some Laravel models that are related via a pivot table in a belongsToMany relation.
Now I try to create a mutation in Laravel Lighthouse to join the models and also fill the pivot values.
Somehow I cannot find out how to do this.

The Course model looks like this:

class Course extends Model
{
    public function programs(): BelongsToMany
    {
        return $this->belongsToMany(\App\Models\Program::class, 'Course_Program')
                    ->withPivot('id', 'year_id')
                    ->withTimestamps();
    }
}

My GraphQL code looks like this:

type Mutation {
    createCourse(input: CreateCourseInput! @spread): Course! @create
}

type Course {
    id: ID!
    name: String!
    programs: [ProgramWithPivot!]! @belongsToMany
}

type Program {
    id: ID!
    name: String!
}

type ProgramWithPivot {
    id: ID!
    name: String!
    year_id: ID!
}

input CreateCourseInput {
    name: String!
    programs: CreateCourseProgramsRelation!
}

input CreateCourseProgramsRelation {
    create: [CreateCourseProgramInput!]
}

input CreateCourseProgramInput {
    id: ID!
    year_id: ID!
}

The problem is that when I try to create programs in my course like this:

mutation {
  createCourse(input: {
    name: "new cours"
    programs: {
      create: [{
        id: 1
        year_id: 2
      }]
    }
  }) {
    id
    programs {
      id
      year_id
    }
  }
}

Laravel Lighthouse tries to insert data into the Program table (and complains that Program.name does not have a default value).
However, I want to insert data (course_id, year_id and program_id) into the Course_Program table.

How do I tell Laravel Lighthouse to insert data in the pivot-table?

Questioner
Hendrik Jan
Viewed
243
lorado 2020-01-08 03:16

Mutating pivot data is currently not there, but I did a PR for this last week. You can follow the PR progress

In general it will be included either the way I did it, or maybe a little bit different. It was discussed in this issue

For now you can update your pivot data only using custom resolver/directive. But probably the best way will be just to wait till PR gets merged.