Расскажем о новом функционале Коллекций, появившемся в минорных версиях, со времени выхода Laravel 8.0.
8.8 Метод pipeInto
Создаёт новый экземпляр указанного класса и передаёт коллекцию в конструктор.
// До: Category::get()->pipe(function (Collection $categories) { return new CategoryCollection($categories); }); // После: Category::get()->pipeInto(CategoryCollection::class);
8.16 Метод splitIn
Разделяет коллекцию на заданное количество групп, полностью заполняя все группы, кроме последней, в которую и идёт не распределенный остаток.
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); $groups = $collection->splitIn(3); $groups->all(); // [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]
8.30 Метод isSingle
Определяет, содержит ли коллекция всего один элемент.
collect([])->isSingle(); // false collect([1])->isSingle(); // true collect([1, 2])->isSingle(); // false
8.39 Метод sole
Получить первый элемент из коллекции, но только если он там такой один. В противном случае выбросить исключение.
$collection = collect([ ['name' => 'foo'], ['name' => 'bar'], ['name' => 'bar'], ]); // Получим ['name' => 'foo'] $result = $collection->where('name', 'foo')->sole(); // Получим ['name' => 'foo'] $result = $collection->sole(function ($value) { return $value['name'] === 'foo'; }); // Будет выброшено исключение ItemNotFoundException $collection->where('name', 'INVALID')->sole(); // Будет выброшено исключение MultipleItemsFoundException $collection->where('name', 'bar')->sole();
8.48 Метод sliding
Создает чанки вида «скользящее окно».
collect([1, 2, 3, 4, 5])->sliding(2); // [[1, 2], [2, 3], [3, 4], [4, 5]]
Удобен в сочетании с методом eachSpread
.
$transactions->sliding(2)->eachSpread(function ($previous, $current) { $current->total = $previous->total + $current->amount; });
Имеется возможность использовать второй параметр step
, который задает расстояние между первым элементом каждого шага.
$chunks = $collection->sliding(3, step: 2); // [[1, 2, 3], [3, 4, 5]]
8.52 Изменены методы shift
и pop
Теперь они теперь могут доставать сразу несколько элементов.
$collection = collect([1, 2, 3, 4, 5]); $collection->pop(3); // [5, 4, 3] $collection->all(); // [1, 2]
$collection = collect([1, 2, 3, 4, 5]); $collection->shift(3); // [1, 2, 3] $collection->all(); // [4, 5]
8.64 Метод hasAny
Определяет, существует ли в коллекции, какой-либо из ключей.
// Пример вернёт true: collect(['first' => 'Hello', 'second' => 'World'])->hasAny(['first', 'fourth']); // Пример вернёт false: collect(['first' => 'Hello', 'second' => 'World'])->hasAny(['third', 'fourth']);
Автор: Pascal Baljet
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.