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

Eloquent: коллекции

Введение

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

Так как объект коллекций итерируемый, вы можете работать с ним в циклах как будто это обычный php-массив:

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

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

However, collections are much more powerful than arrays and expose a variety of map / reduce operations using an intuitive interface. For example, let's remove all inactive models and gather the first name for each remaining user:

Однако коллекции, в отличие от массивов, имеют массу дополнительных очень удобных фич. Например, давайте отфильтруем из результата запроса все неактивные модели и у оставшихся моделей соберем имена пользователей:

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

$names = $users->reject(function ($user) {
	return $user->active === false;
})
->map(function ($user) {
	return $user->name;
});

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

Базовые методы коллекций

Так как коллекции Eloquent являются расширением основного класса коллекций Laravel? они наследуют все его методы:

all chunk collapse contains count diff each filter first flatten flip forget forPage get groupBy has implode intersect isEmpty keyBy keys last map merge pluck pop prepend pull push put random reduce reject reverse search shift shuffle slice sort sortBy sortByDesc splice sum take toArray toJson transform unique values where whereLoose zip

Кастомные коллекции

Если вам нужно расширить класс коллекций Eloquent, добавив туда свои методы, переопределите метод 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);
	}
}

Если вам нужно переопределить класс коллекций для всех моделей, переопределите его в базовой модели, и все свои модели наследуйте от этой базовой модели.