为什么将参数传递给 Laravel Eloquent when() 方法时闭包内的值不正确?

she*_* me -2 php laravel eloquent

当我将此变量传递给 Laravel Eloquent 的when()方法时,我在闭包内的参数有一个奇怪的值。在闭包内,因为$user_id我得到true而不是2. 原因可能是什么?

$user_id = 2;

$orders = Order::with('user')
    ->when(!empty($user_id), function ($query, $user_id) {
        dd($user_id); // <-------- HERE I get TRUE instead of "2" as value.
        $query->where('user_id', $user_id);
    })
    ->when(($filter == 'paymentreceived'), function ($query) {
        $query->paymentConfirmationReceived();
    })
    ->orderBy('id', 'desc')
    ->paginate(50);
Run Code Online (Sandbox Code Playgroud)

lag*_*box 5

传递给闭包回调的第二个参数是“值”。“值”是您传递给的第一个参数when

public function when($value = null, callable $callback = null, callable $default = null)
{
    ...
    return $callback($this, $value) ?? $this;
    ...
}
Run Code Online (Sandbox Code Playgroud)

由于您将布尔值作为第一个参数传递给when, $value,因此您将true作为第二个参数进入回调。(必须如此,true否则该回调将不会被执行)

$user_id如果您希望将其作为参数传递给回调,when则必须将其作为第一个参数传递给(您正在检查的值)。然后,回调的第二个参数将是 的值$user_id

...->when($user_id, function ($builder, $user_id) { ... })
Run Code Online (Sandbox Code Playgroud)

否则,您必须$user_id使用构造从父作用域继承use(如前面的答案所示):

...->when(..., function ($builder) use ($user_id) { ... })
Run Code Online (Sandbox Code Playgroud)

PHP.net 手册 - 匿名函数-示例 #3