Версия фреймворка:
5.4 4.2
Прогресс перевода
Перевод немного отстаёт от оригинала. Коммитов не переведено: 8

Eloquent: Коллекции

Введение

Все наборы результатов, возвращаемые Eloquent, являются экземплярами объекта Illuminate\Database\Eloquent\Collection , в том числе результаты, получаемые с помощью метода get или доступные через отношения. Объект коллекции Eloquent наследует базовую коллекцию Laravel, поэтому он наследует десятки методов, используемых для гибкой работы с базовым набором моделей Eloquent.

Конечно же, все коллекции также служат в качестве итераторов, позволяя вам перебирать их в цикле, как будто они простые PHP-массивы:

$users = App\User::where('active', 1)->get();

foreach ($users as $user) {
    echo $user->name;
}

Тем не менее, коллекции гораздо мощнее, чем массивы и предоставляют различные варианты операций map/reduce, которые могут быть сцеплены с использованием интуитивно понятного интерфейса. Например, давайте удалим все неактивные модели и возвратим имена для каждого оставшегося пользователя:

$users = App\User::all();

$names = $users->reject(function ($user) {
    return $user->active === false;
})
->map(function ($user) {
    return $user->name;
});
Хотя большинство методов для работы с коллекциями Eloquent возвращают новый экземпляр коллекции Eloquent, методы pluck, keys, zip, collapse, flatten и flip возвращают экземпляр базовой коллекции. Более того, если операция map вернёт коллекцию, в которой нет моделей Eloquent, она будет автоматически приведена к базовой коллекции.

Доступные методы

Базовая коллекция

Все коллекции Eloquent наследуют объект базовой коллекции Laravel; поэтому они наследуют все мощные методы, предоставляемые базовым классом коллекции:

all average avg chunk collapse combine concat contains containsStrict count crossJoin dd diff diffKeys dump each eachSpread every except filter first flatMap flatten flip forget forPage get groupBy has implode intersect isEmpty isNotEmpty keyBy keys last map mapInto mapSpread mapToGroups mapWithKeys max median merge min mode nth only pad partition pipe pluck pop prepend pull push put random reduce reject reverse search shift shuffle slice sort sortBy sortByDesc splice split sum take tap toArray toJson transform union unique uniqueStrict unless values when where whereStrict whereIn whereInStrict whereNotIn whereNotInStrict zip

Пользовательские коллекции

Если вам нужно использовать пользовательский объект Collection со своими собственными методами наследования, вы можете переопределить метод newCollection в своей модели:

<?php

namespace App;

use App\CustomCollection;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Создание экземпляра новой Eloquent коллекции.
     *
     * @param  array  $models
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function newCollection(array $models = [])
    {
        return new CustomCollection($models);
    }
}

После определения метода newCollection вы получите экземпляр пользовательской коллекции при любом обращении к экземпляру Collection этой модели. Если вы хотите использовать собственную коллекцию для каждой модели в вашем приложении, вы должны переопределить метод newCollection в базовом классе модели, наследуемой всеми вашими моделями.