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

Laravel分类筛选失效:点击分类始终显示相同3个产品

Laravel分类筛选产品失效问题分析与修复

问题原因

  1. 路由参数与视图传参不匹配
    路由定义的可选参数名为categorie,但视图生成分类链接时,传递的参数键是slug,导致控制器无法正确接收分类slug值,始终进入else分支返回默认的3个产品。

  2. 缺少分类存在性校验
    如果请求的分类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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 16:45:00