Unetway

Laravel - Eloquent Collections

Вступление

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

Все коллекции также служат итераторами, позволяя вам циклически повторять их, как если бы они были простыми массивами 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;
});

В то время как большинство методов сбора Красноречивых возвращают новый экземпляр красноречивой коллекции, pluckkeyszipcollapseflattenи flipметоды возвращают базовый сбор экземпляр. Аналогично, если mapоперация возвращает коллекцию, которая не содержит моделей Eloquent, она будет автоматически преобразована в базовую коллекцию.

 

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

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

Кроме того, класс предоставляет расширенный набор методов, помогающих управлять коллекциями моделей. Большинство методов возвращают экземпляры; однако некоторые методы возвращают базовый экземпляр.Illuminate\Database\Eloquent\CollectionIlluminate\Database\Eloquent\CollectionIlluminate\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метод в классе базовой модели, который расширен всеми вашими моделями.