git 22951bd4bcc7a559cb3d991095ad8c7a087ca010
Все наборы результатов, возвращаемые 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::where('active', 1)->get();
$names = $users->reject(function ($user) {
return $user->active === false;
})
->map(function ($user) {
return $user->name;
});
{note} Хотя большинство методов для работы с коллекциями Eloquent возвращают новый экземпляр коллекции Eloquent, методы
pluck
,keys
,zip
,collapse
,flatten
иflip
возвращают экземпляр базовой коллекции. Более того, если операцияmap
вернёт коллекцию, в которой нет моделей Eloquent, она будет автоматически приведена к базовой коллекции.
Все коллекции Eloquent наследуют объект базовой коллекции Laravel; поэтому они наследуют все мощные методы, предоставляемые базовым классом коллекции:
<style> #collection-method-list > p { column-count: 3; -moz-column-count: 3; -webkit-column-count: 3; column-gap: 2em; -moz-column-gap: 2em; -webkit-column-gap: 2em; } #collection-method-list a { display: block; } </style>all average avg chunk collapse combine contains containsStrict count diff diffKeys each every except filter first flatMap flatten flip forget forPage get groupBy has implode intersect isEmpty isNotEmpty keyBy keys last map mapWithKeys max median merge min mode nth only 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 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
в базовом классе модели, наследуемой всеми вашими моделями.