laravel中的when语句是如何工作的?

1tuwyuhd  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(96)

假设有这样的代码

$users = Model::when($param, function($query) {
        $query->where('id', 1)
    })
    ->get();

如果$param参数存在,则“when”函数将调用该函数,查询将是

select * from table where id = 1

如果没有参数,则查询将为

select * from table

问题是laravel如何以及在哪里收集这个动态请求。

e4yzc0pl

e4yzc0pl1#

如果有疑问,只需查看源代码:https://github.com/laravel/framework/blob/6316655d0bc823854aa3397d2f21515a5eb03929/src/Illuminate/Conditionable/Traits/Conditionable.php#L21-L40
这是一个名为Conditionable\Illuminate\Support\Traits\Conditionable)的trait:

public function when($value = null, callable $callback = null, callable $default = null)
{
    $value = $value instanceof Closure ? $value($this) : $value;

    if (func_num_args() === 0) {
        return new HigherOrderWhenProxy($this);
    }

    if (func_num_args() === 1) {
        return (new HigherOrderWhenProxy($this))->condition($value);
    }

    if ($value) {
        return $callback($this, $value) ?? $this;
    } elseif ($default) {
        return $default($this, $value) ?? $this;
    }

    return $this;
}

Laravel 10.x
因为方法when返回$this(在最后一行),它允许你做$model->when(..., ...)->when(..., ...)->where(xxx)->first()(作为一个例子)。当你像那个例子一样 chain 方法调用时,这被称为method chaining

相关问题