Laravel Lumen中关联查询数据遍历及结果格式化问题
问题根源
你这段代码的问题很明确:在foreach循环里,每次迭代都会完全覆盖$data变量,而且courselist被写成了单个对象而非数组,导致最后只保留了最后一条课程的数据。
两种修复方案
方案一:调整原生查询的循环逻辑
先初始化好$data的基础结构,分类信息只需要赋值一次(因为所有查询结果都属于同一个分类),然后把每个课程逐个追加到courselist数组里:
public function catlist($catid) { $categoryData = DB::table('courses') ->join('categories', 'courses.category_id', '=', 'categories.id') ->select( 'categories.id as catid', 'categories.name as catname', 'courses.id as courseid', 'courses.title as coursename' ) ->where('courses.category_id', '=', $catid) ->get(); // 先判断是否有数据,避免报错 if ($categoryData->isEmpty()) { return response()->json([ 'success' => false, 'message' => '该分类不存在或无对应课程' ], 404); } // 初始化数据结构,分类信息取第一条即可 $firstItem = $categoryData->first(); $data = [ 'category' => [ "id" => $firstItem->catid, "name" => $firstItem->catname, ], 'courselist' => [] // 先把课程列表设为空数组 ]; // 循环把所有课程追加到数组里 foreach ($categoryData as $item) { $data['courselist'][] = [ "id" => $item->courseid, "name" => $item->coursename, ]; } return response()->json([ 'success' => true, 'data' => $data, ], 200); }
方案二:用Eloquent关联(更简洁推荐)
如果你的项目用了Eloquent模型,直接定义关联会更省心:
- 先写Category模型:
// app/Models/Category.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Category extends Model { protected $table = 'categories'; // 一对多关联,一个分类对应多个课程 public function courses() { return $this->hasMany(Course::class, 'category_id'); } }
- 再写Course模型:
// app/Models/Course.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Course extends Model { protected $table = 'courses'; }
- 控制器方法简化成这样:
use App\Models\Category; public function catlist($catid) { // 预加载关联的课程,避免N+1查询 $category = Category::with('courses')->find($catid); if (!$category) { return response()->json([ 'success' => false, 'message' => '分类不存在' ], 404); } // 整理成你要的格式 $data = [ 'category' => [ 'id' => $category->id, 'name' => $category->name ], 'courselist' => $category->courses->map(function ($course) { return [ 'id' => $course->id, 'name' => $course->title ]; }) ]; return response()->json([ 'success' => true, 'data' => $data ], 200); }
修复后返回结果
调整后就能得到你想要的结构:
{ "success": true, "data": { "category": { "id": 1, "name": "Test Category" }, "courselist": [ { "id": 1, "name": "Course 1" }, { "id": 2, "name": "Course 2" } ] } }
内容的提问来源于stack exchange,提问作者Nishanth Govindarasu
相关产品推荐
相关产品推荐

