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
相关产品推荐
相关产品推荐

