Коллекции

Содержание:


Введение

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

Все коллекции выступают в качестве итераторов, что позволяет вам осуществлять перебор так, словно это простые массивы PHP:

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

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

В то же время, коллекции куда более мощная организация данных, которая даёт возможность использовать набор карт и операций, которые можно применять цепочкой через интуитивные интерфейсы. Например, двайте уберём все неактивные модели и соберём первое имя для пользователя:

$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 расширяют базовую коллекцию Ларавел; как следствие, они наследуют весь набор мощных методов базового класса.

Дополнительно, класс Illuminate\Database\Eloquent\Collection предоставляет набор методов, чтобы помочь в управлении вашими коллециями моделей. Большинство методов возвращает экземпляр Illuminate\Database\Eloquent\Collection, но некоторые методы возвращают базовый экземпляр Illuminate\Support\Collection.

contains($key, $operator = null, $value = null)

Метод contains может быть использована для определения того, что экземпляр данной модели включён в коллекцию. Этот метод принимает первичный ключ или экземпляр модели:

$users->contains(1);

$users->contains(User::find(1));

diff($items)

Метод diff возвращает все модели, которых нет в данной коллекции:

use App\User;

$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());

except($keys)

Метод except возвращает все модели, у которых нет данного первичного ключа:

$users = $users->except([1, 2, 3]);

find($key)

Метод find находит модель с данным первичным ключом. Если $key представлено экземпляром модели, то метод find попытается вернуть модель с соотвествующим первичным ключом. Если $key является массивом с ключами, метод find вернёт все модели, которые соотвествуют $keys используя whereIn():

$users = User::all();

$user = $users->find(1);

fresh($with = [])

Метод fresh получает новый экземпляр каждой модели в коллекции из базы данных. Дополнительно, любые указанные связи будут безотложно загружены:

$users = $users->fresh();

$users = $users->fresh('comments');

intersect($items)

Метод intersect возвращает все модели, которые также присутствуют в данной коллекции:

use App\User;

$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());

load($relations)

Метод load безотложно закружает данное отношение для всех моделей в коллекции:

$users->load('comments', 'posts');

$users->load('comments.author');

loadMissing($relations)

Метод loadMissing безотложно загружает данные связи для всех моделей в коллекции, если связи пока не загружены:

$users->loadMissing('comments', 'posts');

$users->loadMissing('comments.author');

modelKeys()

Метод modelKeys возвращает первичный ключ для всех моделей в коллеции:

$users->modelKeys();

// [1, 2, 3, 4, 5]

makeVisible($attributes)

Метод makeVisible делает атрубуты видимыми, которые обычно скрыты для каждой модели в коллекции:

$users = $users->makeVisible(['address', 'phone_number']);

makeHidden($attributes)

Метод makeHidden прячет атрибуты, которые обычно являются "видимыми" для каждой модели в коллекции:

$users = $users->makeHidden(['address', 'phone_number']);

only($keys)

Метод only возвращает все модели, у которых есть данный первичный ключ:

$users = $users->only([1, 2, 3]);

unique($key = null, $strict = false)

Метод unique возвращает все уникальные модели в коллекции. Любые модели того же типа с таким же первичным ключом, как и другая модель, убираются.

$users = $users->unique();

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

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

<?php

namespace App;

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

class User extends Model
{
    /**
     * Create a new Eloquent Collection instance.
     *
     * @param  array  $models
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function newCollection(array $models = [])
    {
        return new CustomCollection($models);
    }
}

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