You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:10:27