РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1025 of 1392 menu

Метод 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 ]); } } ?>

Смотрите также

  • метод unless,
    который выполняет замыкание при ложном условии
  • метод pipe,
    который передаёт коллекцию в замыкание
  • метод tap,
    который выполняет замыкание и возвращает исходный объект
  • метод filter,
    который фильтрует коллекцию по заданному условию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить