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

