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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:41:23