Eloquent: Коллекции
11.x
.
Почему это важно?
Введение
Все наборы результатов, возвращаемые 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;
});
Хотя большинство методов для работы с коллекциями Eloquent возвращают новый экземпляр коллекции Eloquent, методы
pluck
,keys
,zip
,collapse
,flatten
иflip
возвращают экземпляр базовой коллекции. Более того, если операцияmap
вернёт коллекцию, в которой нет моделей Eloquent, она будет автоматически приведена к базовой коллекции.
Доступные методы
Базовая коллекция
Все коллекции Eloquent наследуют объект базовой коллекции Laravel; поэтому они наследуют все мощные методы, предоставляемые базовым классом коллекции:
- 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
в базовом классе модели, наследуемой всеми вашими моделями.