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

Laravel如何通过URL参数传递分类与时间范围筛选课程

如何同时传递分类与时间范围参数到URL并在Laravel控制器中处理

第一步:修正Blade筛选表单

你现在的表单提交时不会传递有效参数,因为两个下拉框都缺少name属性,而且时间范围的选项没有设置结构化的value值。修改后的表单代码如下:

<form class="container">
    <div class="bg-custom-gray p-6 rounded-lg">
        <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
            <div>
                <div class="mb-3">Kategorie</div>
                <!-- 添加name属性,让提交时携带category参数 -->
                <select name="category" class="w-full  p-3 rounded-lg">
                    <option value="0">Lorem Impsum</option>
                    <option value="1">Lorem Impsum</option>
                    <option value="2">Lorem Impsum</option>
                    <option value="3">Lorem Impsum</option>
                    <option value="4">Lorem Impsum</option>
                    <option value="5">Lorem Impsum</option>
                    <option value="6">Lorem Impsum</option>
                    <option value="7">Lorem Impsum</option>
                    <option value="8">Lorem Impsum</option>
                </select>
            </div>
            <div>
                <div class="mb-3">Zeitbereich</div>
                <!-- 添加name属性,给每个选项设置可识别的value值 -->
                <select name="time_range" class="w-full p-3 rounded-lg">
                    <option value="upcoming">Anstehend</option>
                    <option value="today">Heute</option>
                    <option value="tomorrow">Morgen</option>
                    <option value="this_week">Diese Woche</option>
                    <option value="this_weekend">Dieses Wochenende</option>
                    <option value="next_week">Nächste Woche</option>
                    <option value="next_month">Nächster Monat</option>
                </select>
            </div>
        </div>
        <x-button type="submit" class="mt-6 w-full">Suchen</x-button>
    </div>
</form>

第二步:优化控制器查询逻辑

原来的控制器只能处理单一的category参数,且判断逻辑过于死板。现在改成动态构建查询条件,同时支持分类和时间范围筛选,还能保证分页链接保留当前筛选参数:

public function allCoursesList(Request $request)
{
    // 初始化查询构造器,保留默认的"即将开始"条件
    $query = Events::query()->where('start', '>', now());

    // 存在category参数时,添加分类筛选
    if ($request->has('category')) {
        $query->where('category', $request->query('category'));
    }

    // 存在time_range参数时,根据不同值处理时间筛选
    if ($request->has('time_range')) {
        $timeRange = $request->query('time_range');
        switch ($timeRange) {
            case 'today':
                $query->whereDate('start', today());
                break;
            case 'tomorrow':
                $query->whereDate('start', today()->addDay());
                break;
            case 'this_week':
                $query->whereBetween('start', [now()->startOfWeek(), now()->endOfWeek()]);
                break;
            case 'this_weekend':
                // 假设周末为周六至周日,可根据需求调整
                $start = now()->startOfWeek()->addDays(5);
                $end = now()->endOfWeek();
                $query->whereBetween('start', [$start, $end]);
                break;
            case 'next_week':
                $query->whereBetween('start', [now()->addWeek()->startOfWeek(), now()->addWeek()->endOfWeek()]);
                break;
            case 'next_month':
                $query->whereBetween('start', [now()->addMonth()->startOfMonth(), now()->addMonth()->endOfMonth()]);
                break;
            // 'upcoming' 对应默认条件,无需额外处理
        }
    }

    // 分页时携带当前所有查询参数,避免切换分页丢失筛选状态
    $events = $query->paginate(15)->appends($request->query());

    return view('pages.all-events', compact('events'));
}

测试效果

提交表单后,URL会生成类似这样的格式:
example.com/loremimpsum?category=1&time_range=today
控制器通过$request->query()可以同时获取到两个参数,查询逻辑会自动应用对应的筛选条件。分页时,下一页/上一页的链接也会自动带上当前的筛选参数,保持筛选状态不丢失。

内容的提问来源于stack exchange,提问作者anon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:40:27