Laravel 5.2表单制作咨询:编辑帖子时如何预选中关联标签
解决Laravel中多对多关联标签在编辑时自动选中的问题
我太懂这种“当初嫌框架自带工具麻烦非要自己撸,结果遇到关联绑定直接懵圈”的后悔感了!针对你Post和Tag的多对多场景,不管是现在回头用Laravel的表单助手,还是继续用原生Blade写法,都能轻松实现编辑时已关联标签自动选中的需求,下面一步步给你讲:
第一步:控制器传递必要数据到视图
首先在文章编辑的控制器方法里,要把当前文章对象和所有标签列表传给视图:
public function edit(Post $post) { $tags = Tag::all(); // 获取所有标签 return view('posts.edit', compact('post', 'tags')); }
第二步:表单中实现标签自动选中
方式一:用Laravel表单助手(推荐,真香警告)
如果用Laravel Collective的表单助手,Form::model()的模型绑定功能会帮你省掉所有手动判断的代码:
{!! Form::model($post, ['route' => ['posts.update', $post->id], 'method' => 'put']) !!} <!-- 其他文章字段,比如标题、内容 --> <div class="form-group"> {!! Form::label('tags', '关联标签') !!} <!-- 第三个参数传入已关联标签的id数组,助手会自动标记选中 --> {!! Form::select('tags[]', $tags->pluck('name', 'id'), $post->tags->pluck('id')->toArray(), [ 'class' => 'form-control', 'multiple' => true // 开启多选 ]) !!} </div> {!! Form::submit('更新文章', ['class' => 'btn btn-primary']) !!} {!! Form::close() !!}
这里$post->tags->pluck('id')->toArray()会直接取出当前文章已关联的所有标签ID,表单助手会自动匹配选项并标记为selected,完全不用自己写判断逻辑,是不是比手动写清爽太多?
方式二:原生Blade写法(不用助手也能搞定)
如果还是不想用助手,那就在Blade里手动判断每个标签是否已关联:
<form action="{{ route('posts.update', $post->id) }}" method="POST"> @csrf @method('PUT') <!-- 其他文章字段 --> <div class="form-group"> <label for="tags">关联标签</label> <select name="tags[]" id="tags" class="form-control" multiple> @foreach($tags as $tag) <option value="{{ $tag->id }}" {{ $post->tags->contains($tag->id) ? 'selected' : '' }}> {{ $tag->name }} </option> @endforeach </select> </div> <button type="submit" class="btn btn-primary">更新文章</button> </form>
这里用$post->tags->contains($tag->id)来检查当前标签是否已和文章关联,是的话就加selected属性。
第三步:更新文章时同步标签关联
最后别忘了在控制器的update方法里,同步文章和标签的多对多关联:
public function update(Request $request, Post $post) { // 验证并更新文章基本信息 $post->update($request->validate([ 'title' => 'required|string|max:255', 'content' => 'required|string', // 其他字段验证规则 ])); // 同步标签:自动添加新选中的标签,移除取消选中的标签 $post->tags()->sync($request->input('tags', [])); return redirect()->route('posts.show', $post); }
sync()方法是Laravel处理多对多关联的神器,它会自动对比提交的标签ID数组和当前关联的标签,完成添加、移除的操作,不用自己手动处理关联的增删。
说真的,当初避开表单助手确实是走了弯路,尤其是模型绑定和关联字段的处理,助手帮我们封装了很多重复逻辑,反而让代码更简洁可读。现在用上也完全不晚,以后写表单会轻松很多!
内容的提问来源于stack exchange,提问作者Scoob
相关产品推荐
相关产品推荐

