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();
额外优化建议
- 可以省去
$id的赋值步骤,直接在闭包里使用$user_id,代码更简洁:
$course = Course::with(['progress' => function ($query) use ($user_id) { $query->where('user_id', '=', $user_id); }])->get();
- 返回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
相关产品推荐
相关产品推荐

