Вступление
Все множественные результирующие наборы, возвращаемые 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;
});
В то время как большинство методов сбора Красноречивых возвращают новый экземпляр красноречивой коллекции,
pluck,keys,zip,collapse,flattenи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метод в классе базовой модели, который расширен всеми вашими моделями.
0 комментариев