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

Laravel Eloquent when()方法闭包内参数值异常的原因

Laravel Eloquent when()闭包参数值异常原因及解决

问题原因

Laravel的when()方法逻辑是:第一个参数是条件判断表达式,当该表达式为true时,执行第二个参数的闭包。而闭包的第二个参数,默认接收的是第一个条件表达式的返回值,并非你定义的外部变量$user_id。

你在闭包中把参数命名为$user_id,和外部变量重名,导致闭包内的$user_id被覆盖成了!empty($user_id)的计算结果(也就是true),所以才会出现预期值和实际值不符的情况。

解决方法

有两种常用修复方式:

  1. 使用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);
  1. 使用箭头函数(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:42:41