Laravel 5.6中form::select用法及弃用后数据库下拉框替代方案咨询
Laravel 5.6 中 Form::select 的用法及替代方案
嘿,我来帮你理清这个问题!刚好对这块比较熟悉,下面分两部分给你说明:
一、Laravel 5.6 里怎么用 Form::select
先提个醒:Form::select 并不是 Laravel 核心自带的功能,它来自 laravelcollective/html 这个第三方包。要想用它,得先完成安装和配置:
- 安装包:
composer require laravelcollective/html "^5.6"
- 配置服务提供者和别名:
打开config/app.php,在providers数组里添加:
Collective\Html\HtmlServiceProvider::class,
然后在 aliases 数组里加两个别名:
'Form' => Collective\Html\FormFacade::class, 'Html' => Collective\Html\HtmlFacade::class,
搞定配置后,就可以从数据库取数据生成下拉框了。举个例子:假设你有个 Category 模型,要把所有分类做成下拉选项:
// 控制器里获取数据 $categories = App\Category::pluck('name', 'id'); // 把name作为显示文本,id作为选项值 return view('your-form-view', compact('categories'));
然后在 Blade 视图里调用 Form::select:
{!! Form::select('category_id', $categories, null, ['class' => 'form-control', 'placeholder' => '请选择分类']) !!}
给你拆解下参数:
- 第一个
'category_id':下拉框的name属性,提交表单时会用这个键传值 - 第二个
$categories:选项的键值对数组(键是分类id,值是分类名称) - 第三个
null:默认选中的选项(如果要默认选某个分类,换成对应id就行) - 第四个数组:下拉框的额外HTML属性,比如样式类、占位提示这些
二、Form::select 被弃用后的替代方案
没错,后来这个第三方包的表单构建方法逐渐被弃用了,Laravel官方更推荐用原生HTML来写表单——虽然代码看起来多一点,但胜在灵活、可控,还不用依赖第三方包。还是用上面的分类例子,给你两种常用写法:
写法1:原生HTML + Blade循环
控制器里还是先拿数据:
$categories = App\Category::all(); return view('your-form-view', compact('categories'));
然后在视图里写原生的 <select> 标签,用 @foreach 生成选项:
<select name="category_id" class="form-control"> <option value="" selected disabled>请选择分类</option> @foreach($categories as $category) <option value="{{ $category->id }}" {{ old('category_id', isset($model) ? $model->category_id : '') == $category->id ? 'selected' : '' }}> {{ $category->name }} </option> @endforeach </select>
这里用到了 old() 函数,能在表单提交失败后保留用户之前选的值,非常实用;如果是编辑页面,还可以用 $model->category_id 来设置默认选中的选项。
写法2:用集合pluck优化键值对
如果你还是喜欢键值对的形式,可以用 pluck() 把数据处理成id为键、name为值的集合,再遍历:
// 控制器里 $categories = App\Category::pluck('name', 'id'); return view('your-form-view', compact('categories'));
视图里的代码会更简洁:
<select name="category_id" class="form-control"> <option value="" selected disabled>请选择分类</option> @foreach($categories as $id => $name) <option value="{{ $id }}" {{ old('category_id') == $id ? 'selected' : '' }}> {{ $name }} </option> @endforeach </select>
这两种原生写法都是现在Laravel项目里的主流做法,完全可以替代原来的 Form::select。
内容的提问来源于stack exchange,提问作者user007
相关产品推荐
相关产品推荐

