Laravel 遍历服务数据时如何避免 foreach 循环输出重复子分类
解决方法
你有两种常用实现方案,按需选择即可:
方案1:基于已查询的服务集合提取不重复子分类
如果你需要同时保留分页的服务列表数据,额外提取不重复子分类,直接用Laravel集合的内置方法处理即可,不需要额外查库:
- 在控制器中拿到分页服务数据后,新增一行提取不重复子分类的逻辑:
'services' => Service::with('seller.user', 'seller.level', 'subcategory') ->whereHas('seller', function ($query) { return $query->where('status', 'active'); }) ->where('tags', 'like', '%' . $this->tag . '%') ->withAvg('review', 'rating') ->withCount('review') ->paginate(20), // 新增提取不重复子分类逻辑,得到的是完整的子分类模型集合 'uniqueSubcategories' => $services->pluck('subcategory')->unique('id')
- 模板中直接循环提取好的不重复子分类即可:
@foreach ($uniqueSubcategories as $subcategory) {{ $subcategory->name }} <!-- 可直接访问子分类所有字段,比如$subcategory->id、$subcategory->category_id --> @endforeach
注意:你原模板代码里多写了一个$符号,修正为$service->subcategory->name即可正常输出
方案2:直接查询符合条件的子分类(性能更优)
如果你不需要先查服务列表,只需要获取符合过滤条件的服务对应的子分类,直接从子分类模型反向查询即可,天然去重,性能更好:
$subcategories = Subcategory::whereHas('service', function ($query) { // 复用服务的过滤条件 $query->whereHas('seller', function ($q) { $q->where('status', 'active'); })->where('tags', 'like', '%' . $this->tag . '%'); })->get();
直接循环$subcategories就能拿到所有符合条件的完整子分类数据。
内容的提问来源于stack exchange,提问作者Ghiath Al-Khatib
相关产品推荐
相关产品推荐

