Laravel分类筛选失效:点击分类始终显示相同3个产品
Laravel分类筛选产品失效问题分析与修复
问题原因
路由参数与视图传参不匹配
路由定义的可选参数名为categorie,但视图生成分类链接时,传递的参数键是slug,导致控制器无法正确接收分类slug值,始终进入else分支返回默认的3个产品。缺少分类存在性校验
如果请求的分类slug不存在,Category::where('slug',$categorie)->first()->products()会直接抛出错误,当前代码未处理这种异常情况。
修复方案
1. 修正视图中的路由参数
将视图里的路由参数键名从slug改为categorie,确保参数能正确传递到控制器:
<ul> @foreach($categories as $categorie) <li> <a href="{{route('catalogue',['categorie'=>$categorie->slug])}}">{{$categorie->name}}</a> </li> @endforeach </ul>
2. 优化控制器逻辑,增加空值判断
修改控制器的index方法,先判断分类是否存在,再获取对应产品,避免报错同时确保筛选逻辑生效:
function index($categorie = null ) { if($categorie) { // 先查询分类,判断是否存在 $category = \App\Models\Category::where('slug',$categorie)->first(); if($category) { $products = $category->products()->paginate(12); } else { // 分类不存在时返回空集合或404 $products = collect()->paginate(12); // 或者使用 abort(404); 直接返回404页面 } }else{ $products = \App\Models\Product::paginate(3); } $categories = \App\Models\Category::all(); $brands = \App\Models\Brand::all(); return view('catalogue.index',compact('products','categories','brands')); }
3. 可选:优化路由命名参数(提升可读性)
为了让代码逻辑更清晰,也可以把路由参数名改为slug,同步修改控制器参数和视图传参:
// 路由修改为 Route::get('catalogue/{slug?}','App\Http\Controllers\CatalogueController@index')->name('catalogue'); // 控制器方法参数修改为 function index($slug = null ) { if($slug) { $category = \App\Models\Category::where('slug',$slug)->first(); // 后续逻辑同上述优化后的代码 } // ... } // 视图传参保持原写法即可 <li> <a href="{{route('catalogue',['slug'=>$categorie->slug])}}">{{$categorie->name}}</a> </li>
内容的提问来源于stack exchange,提问作者user23719376
相关产品推荐
相关产品推荐

