Laravel Eloquent when()方法闭包内参数值异常的原因
Laravel Eloquent when()闭包参数值异常原因及解决
问题原因
Laravel的when()方法逻辑是:第一个参数是条件判断表达式,当该表达式为true时,执行第二个参数的闭包。而闭包的第二个参数,默认接收的是第一个条件表达式的返回值,并非你定义的外部变量$user_id。
你在闭包中把参数命名为$user_id,和外部变量重名,导致闭包内的$user_id被覆盖成了!empty($user_id)的计算结果(也就是true),所以才会出现预期值和实际值不符的情况。
解决方法
有两种常用修复方式:
- 使用use语法引入外部变量,同时避免闭包参数和外部变量重名:
$user_id = 2; $orders = Order::with('user') ->when(!empty($user_id), function ($query) use ($user_id) { dd($user_id); // 此时输出2 $query->where('user_id', $user_id); }) ->when(($filter == 'paymentreceived'), function ($query) { $query->paymentConfirmationReceived(); }) ->orderBy('id', 'desc') ->paginate(50);
- 使用箭头函数(PHP7.4+支持),箭头函数会自动继承父作用域的变量,写法更简洁:
$user_id = 2; $orders = Order::with('user') ->when(!empty($user_id), fn($query) => $query->where('user_id', $user_id)) ->when(($filter == 'paymentreceived'), function ($query) { $query->paymentConfirmationReceived(); }) ->orderBy('id', 'desc') ->paginate(50);
内容的提问来源于stack exchange,提问作者she hates me
相关产品推荐
相关产品推荐

