Laravel控制器$id未识别问题:动态关联查询失效求助
问题:Laravel查询中动态$id变量无法被识别?
我在Laravel项目里尝试从数据库获取单个用户的信息,当where语句使用静态用户ID值时,查询完全正常:
where('radcheck.username', '=', '5345855');
但换成动态的$id变量后,查询直接失效,还报“$id not found”的错误:
where('radcheck.username', '=', $id);
我明明用echo $id能成功打印出这个值,实在搞不懂为什么查询识别不了它。以下是我的相关代码:
控制器代码
public function show($id) { echo $id; $result = DB::table('radcheck') -> leftJoin('radreply', function ($join) { $join->on('radcheck.username', '=', 'radreply.username') ->where('radcheck.username', '=',$id); }) ->select( 'radcheck.username', DB::raw("max(case when radcheck.attribute = 'Cleartext-Password' then radcheck.value end) as password"), DB::raw("max(case when radcheck.attribute = 'Expiration' then radcheck.value end) as expiration"), DB::raw("max(case when radcheck.attribute = 'ChilliSpot-Max-Total-Octets' then radcheck.value end) as quta"), DB::raw("max(case when radcheck.attribute = 'Simultaneous-Use' then radcheck.value end) as simul"), DB::raw("max(case when radcheck.attribute = 'Max-All-Session' then radcheck.value end) as session"), DB::raw("max(case when radreply.attribute = 'WISPr-Bandwidth-Max-Up' then radreply.value end) as upload"), DB::raw("max(case when radreply.attribute = 'WISPr-Bandwidth-Max-Down' then radreply.value end) as download"), DB::raw("max(radcheck.adsoyad) as realname"), DB::raw("min(radcheck.dtarih) as birthdate"), DB::raw("min(radcheck.telefon) as phone"), DB::raw("min(radcheck.tcno) as tc"), DB::raw("max(radcheck.email) as email"), DB::raw("min(radcheck.id) as id") ) ->get(); return response()->json(['data' => $result]); }
路由定义
Route::resource('users', 'radcheckController');
AJAX代码
$('.edit-user').on('click', function() { var id=$(this).data('id'); $.ajax({ type: 'GET', url: '/users/' + id, data: { '_token': $('input[name=_token]').val(), }, success: function(hr_request) { alert(hr_request); var obj=hr_request.data['0']; alert(obj['username']); $('#username').val(obj['username']); $('#password').val(obj['password']); $('#realname').val(obj['realname']); $('#mobile').val(obj['phone']); $('#email').val(obj['email']); $('#birthdate').val(obj['birthdate']); $('#simul').val(obj['simul']); $('#tc').val(obj['tc']); $('#email').val(obj['email']); $('#date_expir').val(obj['expiration']); $('#quta').val(obj['quta']/1024/1024); $('#sessiontime').val(obj['session']/60); $('#edit-modal-label').html('Edit Selected Row'); $('#addModal').modal('show') }, error: function(hr_request) { console.log(hr_request['username']) ; } }); });
问题原因&解决办法
这其实是PHP闭包函数的作用域问题!你在leftJoin的闭包回调里使用了$id,但闭包默认是无法访问外部作用域的变量的,哪怕这个变量就在同一个方法里也不行。
为什么会出现这种情况?
- 静态ID值能正常工作:因为它是直接写在闭包里的字符串,不存在跨作用域访问的问题。
echo $id能正常打印:因为这行代码是在闭包外面的控制器方法里,属于外部作用域,自然能访问到$id参数。
解决步骤
只需要修改leftJoin的闭包定义,通过use ($id)把外部的$id变量传递到闭包内部即可,修改后的代码片段如下:
-> leftJoin('radreply', function ($join) use ($id) { // 这里加上use ($id) $join->on('radcheck.username', '=', 'radreply.username') ->where('radcheck.username', '=',$id); })
额外验证点
- 你的
Route::resource路由是没问题的,show方法对应的路由就是/users/{id},能正确接收AJAX传递的ID。 - AJAX部分传递ID的逻辑也没问题,毕竟你已经能通过
echo $id看到正确的值了。
把代码修改后,查询应该就能正常识别$id变量,返回正确的用户数据了~
内容的提问来源于stack exchange,提问作者Muh
相关产品推荐
相关产品推荐

