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

