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

Slim框架下Eloquent关联查询变量传递失败报错求助

解决Eloquent闭包中"Undefined variable: id"的问题

这个错误本质是PHP闭包的作用域限制导致的,咱们一步步来修正:

第一步:修正$id的赋值问题

我注意到你代码里$id = $response['user_id'];这行明显有问题——Slim的Response对象不是数组,不能这么取值。你的控制器方法参数里已经直接传入了$user_id,所以应该直接把它赋值给$id,或者直接在后续代码里用$user_id:

public function course($user_id, $request, $response) { 
    // 直接使用方法传入的user_id参数
    $id = $user_id; 
    // 如果你是从请求参数(比如GET/POST)获取user_id,那应该改成:
    // $id = $request->getParam('user_id');

第二步:用use关键字传递变量到闭包

PHP的闭包(匿名函数)有自己独立的作用域,外部变量默认无法访问。所以你需要通过use($id)把外部的$id变量导入到闭包的作用域中,这样Eloquent的查询闭包就能拿到这个值了:

// 关键:在闭包后加上use($id)
    $course = Course::with(['progress' => function ($query) use ($id) { 
        $query->where('user_id', '=', $id); 
    }])->get(); 

额外优化建议

  1. 可以省去$id的赋值步骤,直接在闭包里使用$user_id,代码更简洁:
$course = Course::with(['progress' => function ($query) use ($user_id) { 
    $query->where('user_id', '=', $user_id); 
}])->get(); 
  1. 返回JSON响应时,推荐用Slim内置的withJson方法,它会自动处理编码并设置正确的响应头,比手动json_encode更靠谱:
return $response->withJson($course);

最终修正后的完整代码:

public function course($user_id, $request, $response) { 
    $course = Course::with(['progress' => function ($query) use ($user_id) { 
        $query->where('user_id', '=', $user_id); 
    }])->get(); 
    return $response->withJson($course); 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:14:00