Laravel复选框问题,我无法更新数据透视表

时间:2019-07-12 05:08:28

标签: laravel checkbox eloquent

我正在开发laravel应用程序。在laravel中,我试图更新数据透视表中的一行。在此应用程序中,我有三个表:

  

问题: ID,标题,描述

     

类别: ID,名称

     

category_issues:(数据透视表 id,issue_id,category_id

在laravel中,我尝试更新数据透视表中的一行。我有这种关系:
Issue.php

  

公共功能类别(){
        返回$ this-> belongsToMany('App \ Category','category_issues');      
}

Category.php

  

公共功能问题(){
        返回$ this-> belongsToMany('App \ Issue','category_issues');      
}

问题可以有很多类别。

用于显示类别部分的HTML代码:

<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>

这是更新功能文件:

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');
}

1 个答案:

答案 0 :(得分:0)

Laravel无需在 CategoryIsss 模型上进行创建/更新(您甚至有 CategoryIsss 模型吗?),因此确实很容易更新sync()方法可同时实现所有关系。您已经按照上面的代码正确设置了关系。

在您的update()方法中,您已经具有问题模型,并保存了该模型。您可以通过$request对象从表单中获得一组类别(如果用户未选择任何类别,则没有类别),因此可以像这样更新数据透视表:

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

将空白数组保留为第二个参数是可选的。一个小建议:也许以“类别”而不是“类别”的形式来命名字段,只是为了易于记住它是一个数组。