Метод when
Метод when применяется к запросу Eloquent или Query Builder и позволяет динамически добавлять условия в зависимости от переданного значения. Первым параметром передаётся условие (значение, которое проверяется на истинность), вторым - замыкание, которое выполняется, если условие истинно. Третьим, необязательным параметром, передаётся замыкание, выполняемое при ложном условии.
Синтаксис
<?php
Model::when($condition, $callback, $default);
?>
Пример
Давайте применим фильтрацию по статусу только в том случае, если переменная 'status' не равна null:
<?php
use App\Models\Article;
$status = 'published';
$res = Article::when($status, function ($query) use ($status) {
$query->where('status', $status);
})->get();
foreach ($res as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 1"
"article 2"
"article 3"
Если бы переменная $status была равна null, условие where не было бы применено, и запрос вернул бы все статьи.
Пример
Метод when также принимает третий параметр - замыкание, которое выполняется при ложном условии. В этом примере мы добавим сортировку по дате создания, если поле 'sort' равно 'asc', иначе применим сортировку по убыванию:
<?php
use App\Models\Article;
$sort = 'asc';
$res = Article::when($sort === 'asc', function ($query) {
$query->orderBy('created_at', 'asc');
}, function ($query) {
$query->orderBy('created_at', 'desc');
})->get();
foreach ($res as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 1"
"article 2"
"article 3"
Пример
Метод when отлично подходит для построения поисковых запросов с множеством необязательных параметров. В этом примере мы фильтруем статьи по автору и категории, если соответствующие параметры переданы:
<?php
use App\Models\Article;
$authorId = 5;
$categoryId = null;
$res = Article::when($authorId, function ($query) use ($authorId) {
$query->where('author_id', $authorId);
})->when($categoryId, function ($query) use ($categoryId) {
$query->where('category_id', $categoryId);
})->get();
foreach ($res as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 5"
"article 12"
"article 23"
Поскольку $categoryId равен null, второе условие where не применяется, и выборка происходит только по автору.