我正在做一个拉拉维尔应用程序。在laravel中,我试图更新透视表中的一行。在此应用程序中,我有三个表:
问题:id,标题,描述
类别:id、名称
category_issues:(pivot table)id,issue_id,category_id
在laravel中,我试图更新透视表中的一行。我有以下关系:
issue.php
public function categories(){
return$this->bongstomany('app\category','category_issues');
}
category.php
public function issues(){
return$this->bongstomany(“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');
}
Laravel不是在CategoryIssue模型上进行创建/更新(您甚至有CategoryIssue模型吗?),而是通过sync()
方法轻松地一次更新关系的枢轴。您已经根据上面的代码正确地设置了关系。
在update()
方法中,您已经有了问题模型,并已将其保存。通过$request
对象从表单中输入了一组类别(如果用户没有选择任何,则为无),因此可以如下所示更新数据透视:
$issue->categories()->sync($request->get('category', []));
保留空数组作为第二个参数是可选的。一个小建议:也许把字段的名字放在'categories'表单上,而不是'categories'表单上,以便于记住它是一个数组。