Как работает оператор «когда» в laravel?

Допустим, есть такой код

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

функция «когда», если присутствует параметр $param, вызовет функцию, и запрос будет

select * from table where id = 1

Если параметр отсутствует, то запрос будет

select * from table

Вопрос в том, как и где laravel собирает этот динамический запрос.

stackoverflow.com/a/57128668/5947043
ADyson 30.03.2023 13:00

Если это не поможет, не могли бы вы уточнить вопрос и быть более конкретным.

ADyson 30.03.2023 13:02

Спасибо. Вы спрашиваете, что вызывает выполнение функции обратного вызова?

ADyson 30.03.2023 14:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
4
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если сомневаетесь, просто перейдите к исходному коду: 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 30.03.2023 14:57

@ceejayoz хороший улов! я обновлю его

matiaslauriti 30.03.2023 15:00

@matiaslauriti Мне кажется, вопрос именно в том, как Laravel подставляет условие -> where(). В чистом PHP вам нужно было бы написать, если параметр существует, затем $pdo->prepare("выбрать из таблицы, где столбец = : столбец"); Если его нет, то $pdo->prepare("выбрать из таблицы");

KordDEM 31.03.2023 09:26

@KordDEM и ответ буквально в коде

matiaslauriti 31.03.2023 12:17

@matiaslauriti я только что объяснил =)

KordDEM 31.03.2023 14:05

Другие вопросы по теме