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

Laravel 遍历服务数据时如何避免 foreach 循环输出重复子分类

解决方法

你有两种常用实现方案,按需选择即可:

方案1:基于已查询的服务集合提取不重复子分类

如果你需要同时保留分页的服务列表数据,额外提取不重复子分类,直接用Laravel集合的内置方法处理即可,不需要额外查库:

  1. 在控制器中拿到分页服务数据后,新增一行提取不重复子分类的逻辑:
'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')
  1. 模板中直接循环提取好的不重复子分类即可:
@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:45:03