Допустим, есть такой код
$users = Model::when($param, function($query) {
$query->where('id', 1)
})
->get();
функция «когда», если присутствует параметр $param, вызовет функцию, и запрос будет
select * from table where id = 1
Если параметр отсутствует, то запрос будет
select * from table
Вопрос в том, как и где laravel собирает этот динамический запрос.
Если это не поможет, не могли бы вы уточнить вопрос и быть более конкретным.
Спасибо. Вы спрашиваете, что вызывает выполнение функции обратного вызова?






Если сомневаетесь, просто перейдите к исходному коду: https://github.com/laravel/framework/blob/6316655d0bc823854aa3397d2f21515a5eb03929/src/Illuminate/Conditionable/Traits/Conditionable.php#L21-L40
Это черта называется 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() (в качестве примера). Это называется цепочкой методов, когда вы цепляете вызовы методов, как в этом примере.
Вероятно, ключом к пониманию OP является то, что return $this включает так называемую «цепочку методов», которая широко используется построителем запросов Laravel.
@ceejayoz хороший улов! я обновлю его
@matiaslauriti Мне кажется, вопрос именно в том, как Laravel подставляет условие -> where(). В чистом PHP вам нужно было бы написать, если параметр существует, затем $pdo->prepare("выбрать из таблицы, где столбец = : столбец"); Если его нет, то $pdo->prepare("выбрать из таблицы");
@KordDEM и ответ буквально в коде
@matiaslauriti я только что объяснил =)