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

Laravel中将for循环结果附加到Eloquent输出 实现按分类分组对应标题

现有代码的问题

  • 循环内直接赋值$details而非追加内容,最终只会保留最后一个分类的数据
  • $titles = Category::where('type',$category->type); 仅生成了查询构造器,没有调用get()执行查询,拿到的不是实际数据,自然无法直接读取title属性
  • 查询分类时指定获取的是category字段,但后续取值用的是$category->type,字段对应错误,无法正常取值
  • 单个分类下有多个title,你没有把标题存入子数组,返回结构不符合预期

最优实现方案(一次查询完成,无N+1性能问题)

public function type(Request $request)
{
    // 一次查询所有分类数据,按category字段分组
    $categoryGroup = Category::all()->groupBy('category');
    
    $details = [];
    foreach ($categoryGroup as $catName => $itemList) {
        $titles = $itemList->map(function ($item) {
            return [
                'title' => $item->title,
                'pk' => $item->pk
            ];
        })->toArray();
        $details[] = [
            'cat' => $catName,
            'titles' => $titles
        ];
    }

    return response()->json([
        "Data" => $details
    ]);
}

前端拿到返回的Data数组后,遍历每个分类输出分类名,再遍历对应titles数组输出标题,即可完全匹配你需要的展示效果。

原写法修正版(仅做逻辑修复,不推荐使用,存在N+1查询性能问题)

public function type(Request $request)
{
    $details = [];
    // 取去重的分类字段值
    $categories = Category::distinct()->get(['category']);

    foreach($categories as $category){
        // 执行查询拿到该分类下所有数据
        $titles = Category::where('category', $category->category)->get();
        // 处理生成标题数组
        $titleList = $titles->map(function ($item) {
            return [
                'title' => $item->title,
                'pk' => $item->pk
            ];
        })->toArray();
        // 把当前分类数据追加到结果数组,不要直接覆盖
        $details[] = [
            'cat' => $category->category,
            'titles' => $titleList
        ];
    }

    return response()->json([
         "Data" => $details
    ]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 16:54:03