假设有这样的代码
$users = Model::when($param, function($query) { $query->where('id', 1) }) ->get();
如果$param参数存在,则“when”函数将调用该函数,查询将是
select * from table where id = 1
如果没有参数,则查询将为
select * from table
问题是laravel如何以及在哪里收集这个动态请求。
e4yzc0pl1#
如果有疑问,只需查看源代码:https://github.com/laravel/framework/blob/6316655d0bc823854aa3397d2f21515a5eb03929/src/Illuminate/Conditionable/Traits/Conditionable.php#L21-L40这是一个名为Conditionable(\Illuminate\Support\Traits\Conditionable)的trait:
Conditionable
\Illuminate\Support\Traits\Conditionable
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。
when
$this
$model->when(..., ...)->when(..., ...)->where(xxx)->first()
method chaining
1条答案
按热度按时间e4yzc0pl1#
如果有疑问,只需查看源代码:https://github.com/laravel/framework/blob/6316655d0bc823854aa3397d2f21515a5eb03929/src/Illuminate/Conditionable/Traits/Conditionable.php#L21-L40
这是一个名为
Conditionable
(\Illuminate\Support\Traits\Conditionable
)的trait:Laravel 10.x
因为方法
when
返回$this
(在最后一行),它允许你做$model->when(..., ...)->when(..., ...)->where(xxx)->first()
(作为一个例子)。当你像那个例子一样 chain 方法调用时,这被称为method chaining
。