为什么在Laravel的查询闭包内使用$request会报Undefined Variable错误
解决方案
你遇到的报错是PHP闭包的作用域规则导致的:匿名函数默认无法直接访问父作用域的变量,需要通过use关键字将需要的外部变量导入闭包的作用域内。
你只需要修改whereNotExists后的闭包声明,将$request导入即可,修正后的完整代码如下:
Table1::addSelect(['PaymentStatus' => Table2::selectRaw('COUNT(*)') ->whereColumn('AccountNumber','Table1.AccountNumber') ->whereColumn('ServicePeriodEnd','Table1.ServicePeriodEnd') ])->whereNotExists(function($query) use ($request) { // 新增use ($request)导入外部变量 $query->select(DB::raw('*')) ->from('Table2') ->whereRaw('Table1.AccountNumber = Table2.AccountNumber') ->whereRaw('Table1.ServicePeriodEnd = Table2.ServicePeriodEnd') ->where('AccountNumber', $request->AccountNum); })->where('AccountNumber', $request->AccountNum) ->orderBy('ServicePeriodEnd','desc') ->get();
补充说明
- 如果需要导入多个外部变量到闭包中,在
use的括号内用逗号分隔即可,例如use ($request, $otherVar) - 如果你使用的是PHP7.4及以上版本,也可以用短闭包(箭头函数)写法,短闭包会自动捕获父作用域的变量,无需手动
use:
->whereNotExists(fn($query) => $query->select(DB::raw('*')) ->from('Table2') ->whereRaw('Table1.AccountNumber = Table2.AccountNumber') ->whereRaw('Table1.ServicePeriodEnd = Table2.ServicePeriodEnd') ->where('AccountNumber', $request->AccountNum) )
内容的提问来源于stack exchange,提问作者Play Free
相关产品推荐
相关产品推荐

