Mg Sein
Mg Sein

Reputation: 43

Laravel checkbox problem which I cannot update the pivot table

I'm working on a laravel application. In laravel I'm trying to update a row from a pivot table. In this application I have three tables:

issues: id, title, description

categories: id, name

category_issues:(pivot table) id, issue_id, category_id

In laravel I'm trying to update a row from a pivot table. I have this relationships:
Issue.php

public function categories() {
return $this->belongsToMany('App\Category', 'category_issues');
}

Category.php

public function issues() {
return $this->belongsToMany('App\Issue', 'category_issues');
}

A issue can have many categories.

Html code for displaying category section:

<div class="form-group row">
                    <label for="category" class="col-md-4 col-form-label text-md-right">{{ __('Category :') }}</label>
                    <div class="form-check col-md-6">
                      @foreach ($categories as $category)

                        <input type="checkbox" name="category[]" id="{{ $category->id }}" value="{{ $category->id }}"
                        {{ in_array($category->id, $issue->categories->pluck('id')->toArray())  ? 'checked' : '' }}>

                        <label for="{{ $category->id }}"> {{ $category->name }} </label>
                      @endforeach
                    </div>
                  </div>

Here is the update function file:

public function update(Issue $issue)
{
  request()->validate([
      'title'=> ['required', 'min:3'],
      'description'=> ['required', 'min:3'],
      'category' => ['required']
    ]);
  $issue->title = request('title');
  $issue->description = request('description');
  $issue->save();

  //Category_Issue Update
    $categoryIssue = new CategoryIssue;
    $cats = request('category');

     foreach ($cats as $cat) {
       $categoryIssue->updateOrCreate([
         'issue_id'=> $issue->id,
         'category_id' => $cat
       ]);
     }
     return redirect('issues')->with('success', 'Issue has been updated');
}

Upvotes: 0

Views: 255

Answers (1)

Watercayman
Watercayman

Reputation: 8178

Instead of doing the creation / update on the CategoryIssue model (do you even have a CategoryIssue model?), Laravel makes this really easy to update the pivots of a relationship all at once, with the sync() method. You've set up the relationships correctly already per your code above.

In your update() method, you already have your Issue model, and have saved it. You have a set of categories coming in from the form via the $request object (or none if user didn't choose any), so you can then update the pivot like this:

$issue->categories()->sync($request->get('category', []));

Leaving a blank array as the second argument is optional. One small suggestion: maybe make the name of the field on the form 'categories' instead of 'category' just to keep it easy to remember it is an array coming in.

Upvotes: 0

Related Questions