Laravel 5中用Laravel Collective实现下拉框保留当前选中项及剩余选项
实现Laravel下拉框保留已选语言并显示所有可选项
我来帮你搞定这个下拉框的需求,其实步骤很简单,咱们一步步来:
第一步:优化控制器的数据获取
你现在用get()获取$guests,但根据where('id', $id)的条件,这应该是单个访客的数据,用first()会更合适,这样拿到的是单个Person模型实例,处理关联关系更方便。另外,获取语言列表的时候,保留id和name的键值对,比单纯的名称数组更实用:
// 控制器代码优化 $guest = Person::where('id', $id)->with('languages')->first(); // 生成 id => name 的数组,方便下拉框选项使用 $languages = Language::pluck('name', 'id'); return view('layouts.visitor', ['guest' => $guest, 'languages' => $languages]);
第二步:在Blade视图中渲染下拉框
接下来在layouts.visitor视图里,我们可以用原生HTML或者Laravel的表单辅助函数来生成下拉框,自动标记已选的语言:
方式一:原生HTML实现
这种方式不需要额外依赖,直接写HTML就行:
<select name="language_id" class="form-control"> @foreach($languages as $id => $name) <option value="{{ $id }}" {{ $guest->languages->contains($id) ? 'selected' : '' }}> {{ ucfirst($name) }} <!-- 首字母大写让显示更美观 --> </option> @endforeach </select>
这里用$guest->languages->contains($id)判断当前语言是否已经被访客选中,如果是就添加selected属性,自动选中。
方式二:Laravel Collective表单辅助函数(如果你用了这个包)
如果项目里安装了Laravel Collective的Form组件,代码会更简洁:
{!! Form::select('language_id', $languages, $guest->languages->pluck('id')->first(), ['class' => 'form-control']) !!}
如果是多语言多选的需求,只需要稍微修改,添加multiple属性:
{!! Form::select('language_ids[]', $languages, $guest->languages->pluck('id')->toArray(), ['class' => 'form-control', 'multiple' => true]) !!}
补充说明
- 如果你的
Person和Language是多对多关系(看起来应该是),$guest->languages会返回关联的语言集合,contains($id)方法可以直接判断是否包含某个语言ID。 - 如果访客还没有选择任何语言,下拉框不会有默认选中项,符合预期。
内容的提问来源于stack exchange,提问作者FabricioG
相关产品推荐
相关产品推荐

