Коллекции
Содержание:
Введение
Все наборы с несколькими результатами, возвращаемые 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
для базового класса модели,
который расширяется всеми вашими моделями.