Laravel项目实现产品按冷热菜品分类过滤的方法
Laravel 菜品分类过滤实现方案
1. 先确认数据库字段
得保证你的products表有对应分类的字段——要么直接存分类名称(比如"Hot Dish"、"Cold Dish",字段名比如menu_category),要么用关联ID(比如menu_variety_id关联menu_varieties表的主键),这是筛选的基础。
2. 修改控制器处理筛选逻辑
在控制器的index方法里,接收前端传的分类参数,动态过滤产品:
public function index(Request $request) { // 先构建基础查询 $productsQuery = Products::orderBy('created_at', 'desc'); // 检查是否有分类筛选参数 if ($category = $request->get('category')) { // 如果是按分类名称筛选,用这个 $productsQuery->where('menu_category', $category); // 如果是按关联ID筛选,替换成下面这行 // $productsQuery->where('menu_variety_id', $category); } $uploadProducts = $productsQuery->get(); $addProducts = AddProducts::all(); $dishes = Dishes::all(); $variety = MenuVariety::all(); return view('Products.products', compact('uploadProducts','dishes','addProducts', 'variety')); }
3. 改造下拉表单支持筛选提交
把表单改成GET提交(适合筛选场景,支持书签和刷新),并且让下拉框默认选中当前筛选的分类:
<form method="GET" action="{{ route('products.index') }}"> <div class="form-group"> <label for="category">Product Type:</label> <select class="form-control" name="category" id="category" onchange="this.form.submit()"> <!-- 加个“全部产品”的默认选项 --> <option value="" {{ request('category') == '' ? 'selected' : '' }}>All Products</option> @foreach ($variety as $cate) <option value="{{ $cate->menu_categories }}" {{ request('category') == $cate->menu_categories ? 'selected' : '' }}> {{ $cate->menu_categories }} </option> @endforeach </select> </div> <!-- 也可以加个提交按钮,或者用上面的onchange自动提交 --> <!-- <button type="submit" class="btn btn-sm btn-primary">筛选</button> --> </form>
提示:如果你的路由没命名,把
route('products.index')换成url('/products')就行;加onchange是选完分类自动提交,不用点按钮,更方便。
4. 产品展示代码不用改
原来的产品循环代码直接保留就行,因为$uploadProducts已经是筛选后的结果了,只会显示对应分类的菜品。
可选优化
- 如果想要无刷新筛选,给下拉框绑定AJAX事件,请求控制器返回筛选后的产品HTML片段,替换页面上的产品区域。
- 给
products表的分类字段加数据库索引,提升筛选速度。
内容的提问来源于stack exchange,提问作者GHIGB
相关产品推荐
相关产品推荐

