Метод when
Метод when применяется к коллекциям, запросам Eloquent
или Query Builder и выполняет переданное замыкание только в том случае,
если первым параметром передано значение, которое приводится к true.
Метод принимает три параметра: условие, замыкание для выполнения
при истинности условия и опциональное замыкание для выполнения
при ложности условия. Метод возвращает тот же объект, к которому
он был применён.
Синтаксис
<?php
$object->when($condition, $callback, $defaultCallback);
?>
Пример с коллекцией
Давайте проверим, есть ли в коллекции элемент со значением 'article', и если есть, то преобразуем все элементы в верхний регистр:
<?php
use Illuminate\Support\Collection;
$collection = collect(['article', 'user', 'category']);
$res = $collection->when(
$collection->contains('article'),
function (Collection $coll) {
return $coll->map(function ($item) {
return strtoupper($item);
});
}
);
print_r($res->toArray());
?>
Результат выполнения кода:
["ARTICLE", "USER", "CATEGORY"]
Пример с Eloquent запросом
Давайте применим метод when к запросу Eloquent.
Если передан параметр 'status' со значением 'published',
то добавим условие фильтрации по статусу:
<?php
use AppModelsArticle;
$status = 'published';
$articles = Article::when(
$status === 'published',
function ($query) {
return $query->where('status', 'published');
}
)->get();
foreach ($articles as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 1"
"article 2"
"article 3"
Пример с параметром поиска
Давайте используем метод when для добавления условия поиска
по названию статьи, если передан параметр запроса:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function index(Request $request)
{
$search = $request->input('search');
$articles = Article::when(
$search,
function ($query) use ($search) {
return $query->where('title', 'like', '%' . $search . '%');
}
)->get();
return view('articles.index', [
'articles' => $articles
]);
}
}
?>
Пример с замыканием по умолчанию
Давайте передадим третьим параметром замыкание, которое выполнится,
если условие ложно. Если статус не равен 'published',
то выберем все статьи со статусом 'draft':
<?php
use AppModelsArticle;
$status = 'draft';
$articles = Article::when(
$status === 'published',
function ($query) {
return $query->where('status', 'published');
},
function ($query) {
return $query->where('status', 'draft');
}
)->get();
foreach ($articles as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 4"
"article 5"
"article 6"
Пример с множественными условиями
Давайте используем метод when несколько раз подряд
для добавления нескольких условий в запрос:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function index(Request $request)
{
$status = $request->input('status');
$category = $request->input('category');
$articles = Article::when(
$status,
function ($query) use ($status) {
return $query->where('status', $status);
}
)->when(
$category,
function ($query) use ($category) {
return $query->where('category', $category);
}
)->get();
return view('articles.index', [
'articles' => $articles
]);
}
}
?>