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 复选框问题,我无法更新数据透视表的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试在 laravel 中更新数据透视表的内容时,有啥方法可以解决非法偏移类型错误