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

Posted

技术标签:

【中文标题】Laravel 复选框问题,我无法更新数据透视表【英文标题】:Laravel checkbox problem which I cannot update the pivot table 【发布时间】:2019-11-21 20:09:13 【问题描述】:

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

问题: id、标题、描述

类别: id、名称

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

在 laravel 中,我试图从数据透视表中更新一行。我有这种关系: 问题.php

公共函数类别() 返回 $this->belongsToMany('App\Category', 'category_issues');

Category.php

公共功能问题() return $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】:

Laravel 无需在 CategoryIssue 模型上创建/更新(你甚至有 CategoryIssue 模型吗?),Laravel 让更新使用sync() 方法同时建立关系。您已经按照上面的代码正确设置了关系。

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

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

保留一个空白数组作为第二个参数是可选的。一个小建议:也许在表单上使用“类别”而不是“类别”字段的名称,以便于记住它是一个传入的数组。

【讨论】:

以上是关于Laravel 复选框问题,我无法更新数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

laravel4 更新数据透视表中的附加列

laravel:更新或创建(更新插入)数据透视表

当我尝试在 laravel 中更新数据透视表的内容时,有啥方法可以解决非法偏移类型错误

在多对多关系 laravel4 的情况下更新数据透视表

如何在 laravel 5 中使用 Eloquent 更新数据透视表

Laravel 5.4 如何更新数据透视表?