php 为什么在向Laravel Eloquent when()方法传递参数时,闭包中的值不正确?

qv7cva1a  于 2023-03-28  发布在  PHP
关注(0)|答案(2)|浏览(150)

当我将这个变量传递给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);
wtzytmuj

wtzytmuj1#

传递给闭包callback的第二个参数是“value”。“value”是传递给when的第一个参数:

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

因为你传递了一个布尔值作为第一个参数给when$value,你在回调中得到了true作为第二个参数。(它必须是true,否则这个回调不会被执行)
如果你想把$user_id作为参数传递给回调函数,你必须把它作为第一个参数传递给when(你正在检查的值)。然后,回调函数的第二个参数将是$user_id的值。

...->when($user_id, function ($builder, $user_id) { ... })

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

...->when(..., function ($builder) use ($user_id) { ... })

PHP.net Manual - Anonymous Functions-示例#3

vawmfj5a

vawmfj5a2#

浏览:https://www.php.net/manual/en/language.references.pass.php#123995
像这样使用:

$user_id = 2;

$orders = Order::with('user')
    ->when(!empty($user_id), function ($query) use ($user_id) {
        $query->where('user_id', $user_id);
    })
    ->when(($filter == 'paymentreceived'), function ($query) {
        $query->paymentConfirmationReceived();
    })
    ->orderBy('id', 'desc')
    ->paginate(50);

相关问题