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

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模型,直接定义关联会更省心:

  1. 先写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');
    }
}
  1. 再写Course模型:
// app/Models/Course.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Course extends Model
{
    protected $table = 'courses';
}
  1. 控制器方法简化成这样:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:33:16