Что нового в Laravel Collections

Расскажем о новом функционале Коллекций, появившемся в минорных версиях, со времени выхода 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.