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

Laravel使用Dropdown分类筛选后下拉框仅显示已选分类问题

问题根因

下拉选项渲染的数据源选错了:

  • 你当前是遍历筛选后的产品集合$products取关联分类来生成下拉选项,当执行分类筛选后,$products里仅包含当前选中分类下的产品,自然读不到其他分类数据,下拉框就只会显示当前筛选的单个分类
  • 就算在未筛选状态,这个写法也会有重复选项的bug:如果某个分类下有多个产品,下拉框里会重复出现多次同一个分类选项
修复方案

第一步:调整控制器逻辑

单独查询全部分类数据传给视图,这个数据不受筛选条件影响,专门用来渲染下拉选项,筛选后的产品数据仅用来渲染产品列表即可。
修改后的控制器代码:

// 引入分类模型,注意如果控制器头部已经有引入可以跳过这行
use App\Models\Category;

// 查询全部分类,不受筛选条件影响
$categories = Category::all();

if(request()->category_filter){
    $resultCategory = request()->category_filter;
    $products = Product::where('category_id', $resultCategory)->with(['category', 'image'])->get();
}else{
    $products = Product::with(['category', 'image'])->get();
}

return view('home.products', compact('products', 'categories'));

第二步:修改视图下拉框代码

把下拉框的遍历数据源从$products替换为我们单独查询的$categories,同时增加选中状态判断,让筛选后下拉框默认选中当前筛选的分类,补充一个全部分类的默认选项,不用点重置也能切回全量产品视图。
找到视图中<select name="category_filter">部分的代码,替换为:

<select name="category_filter" id="category_filter" class="form-select mb-2">
    <option value="">全部分类</option>
    @foreach ($categories as $category)
        <option value="{{ $category->id }}" {{ request()->get('category_filter') == $category->id ? 'selected' : '' }}>
            {{ $category->name }}
        </option>
    @endforeach
</select>

改完之后不管有没有执行筛选,下拉框都会展示全部分类选项,不会再出现只剩单个选项的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:01:01