Laravel框架Blade模板中如何获取产品筛选字段的去重唯一值
解决方案
你现有代码存在两个核心问题:
- 遍历的是分页后的产品列表,就算做去重也只能拿到当前页的format值,无法覆盖全量产品的可选筛选值
array_unique()是数组去重方法,你传入的是单个字符串$resolution->format,完全起不到去重效果
第一步:控制器中查询全量去重的筛选字段值
直接用查询构造器的distinct()方法获取去重后的字段值,同时支持查询format和attribute两个筛选维度,修改后控制器代码如下:
$itemQuery = Item::where('active_status', 1)->where('status', "1"); // 原有产品分页逻辑,注意原代码$item_count直接赋值查询构造器是错误的,需要调用count()获取总数 $data['item_count'] = $itemQuery->count(); $data['item'] = $itemQuery->paginate(20); // 新增全量去重筛选值查询 $data['filters']['formats'] = $itemQuery->distinct()->pluck('format')->toArray(); $data['filters']['attributes'] = $itemQuery->distinct()->pluck('attribute')->toArray(); return view('frontend.pages.explore', compact('data'));
第二步:Blade模板遍历去重后的筛选值
直接遍历控制器已经处理好的去重数组即可,不需要在前端做额外去重逻辑:
<!-- format筛选器 --> <div class="filter-btn"> @foreach($data['filters']['formats'] as $format) <a class="btn btn-white-outline display-4" href="">{{ $format }}</a> @endforeach </div> <!-- attribute筛选器 --> <div class="filter-btn"> @foreach($data['filters']['attributes'] as $attribute) <a class="btn btn-white-outline display-4" href="">{{ $attribute }}</a> @endforeach </div>
可选优化:带产品数量统计的筛选值
如果需要展示每个筛选值对应的产品数量,可以改用groupBy写法:
- 控制器查询代码:
$data['filters']['formats'] = $itemQuery->select('format', \DB::raw('count(*) as count')) ->groupBy('format') ->get() ->toArray();
- Blade输出代码:
<a class="btn btn-white-outline display-4" href="">{{ $format['format'] }} ({{ $format['count'] }})</a>
内容的提问来源于stack exchange,提问作者Praful
相关产品推荐
相关产品推荐

