Laravel中Enum字段过滤:从迁移获取枚举值实现下拉筛选
解决方法
1. 统一维护枚举值(推荐)
在Competition模型中添加状态枚举常量,和迁移文件的定义保持一致,方便后续统一修改:
class Competition extends Model { // 状态枚举值及对应显示文本 const STATUS_OPTIONS = [ 'inactive' => '未激活', 'to_push' => '待推送', 'active' => '已激活' ]; }
2. 修改控制器逻辑
替换原来从数据库行数据获取状态的代码,直接使用模型中的枚举常量,同时加入筛选功能:
public function index(Request $request) { // 初始化查询构造器 $competitions = Competition::query(); // 根据筛选参数过滤数据 if ($request->has('status')) { $competitions->where('status', $request->status); } $competitions = $competitions->get(); // 获取状态枚举选项 $status_filter = Competition::STATUS_OPTIONS; $request->flash(); return view('competition.index', compact('competitions', 'status_filter')); }
3. 更新视图代码
给下拉框添加name属性用于提交筛选参数,同时保留刷新后的选中状态:
<div> <span> <!-- 包裹表单(如果页面没有现有表单的话) --> <form method="get" action="{{ route('competition.index') }}"> <select class="mb-2" name="status"> <option value="" disabled {{ old('status') === null ? 'selected' : '' }}>状态</option> @foreach ($status_filter as $key => $status) <option value="{{ $key }}" {{ old('status') == $key ? 'selected' : '' }}> {{ $status }} </option> @endforeach </select> <button type="submit" class="btn btn-sm btn-primary">筛选</button> </form> </span> </div>
简化方案(无需模型常量)
如果不想在模型中定义常量,也可以直接在控制器中声明枚举数组:
$status_filter = [ 'inactive' => '未激活', 'to_push' => '待推送', 'active' => '已激活' ];
这样就能保证下拉菜单始终显示迁移中定义的所有状态选项,不会因为数据库中没有对应记录而缺失。
内容的提问来源于stack exchange,提问作者Yorkata008
相关产品推荐
相关产品推荐

