Eloquent: Coleções
Introdução
Todos os métodos Eloquent que retornam mais de um modelo resultarão em instâncias da classe Illuminate\Database\Eloquent\Collection
, incluindo resultados recuperados via o método get
ou acessados via uma relação. O objeto collection do Eloquent estende a coleção base do Laravel, então ele herda naturalmente dezenas de métodos usados para trabalhar com fluidez com o array subjacente de modelos Eloquent. Tenha certeza de revisar a documentação da coleção do Laravel para aprender tudo sobre esses métodos úteis!
Todas coleções também servem como iteradores, permitindo que você passe por eles como se fossem simples matrizes PHP:
use App\Models\User;
$users = User::where('active', 1)->get();
foreach ($users as $user) {
echo $user->name;
}
No entanto, como já mencionado, os conjuntos são muito mais poderosos do que as matrizes e expõem uma variedade de operações map/reduce que podem ser encadeadas usando uma interface intuitiva. Por exemplo, podemos remover todos os modelos inativos e depois reunir o primeiro nome para cada usuário restante:
$names = User::all()->reject(function (User $user) {
return $user->active === false;
})->map(function (User $user) {
return $user->name;
});
Conversão de Eloquent Collection
Enquanto a maioria dos métodos de coleção Eloquent retornam uma nova instância de uma coleção Eloquent, os métodos collapse
, flatten
, flip
, keys
, pluck
e zip
retornam uma instância de coleção básica. Da mesma forma, se uma operação map
retornar uma coleção que não contém nenhum modelo Eloquent, ela será convertida em uma instância de coleção básica.
Métodos disponíveis
Todas as coleções Eloquent estendem o objeto collection do Laravel portanto, elas herdam todos os métodos poderosos fornecidos pela classe de coleção base.
Além disso, a classe Illuminate/Database/Eloquent/Collection
fornece um superconjunto de métodos para ajudar na gestão das suas coleções de modelos. A maioria dos métodos retorna instâncias de Illuminate/Database/Eloquent/Collection
, mas alguns métodos, como o modelKeys
, retornam uma instância de Illuminate/Support/Collection
.
appendcontainsdiffexceptfindfreshintersectloadloadMissingmodelKeysmakeVisiblemakeHiddenonlysetVisiblesetHiddentoQueryunique
append($attributes)
O método append
pode ser utilizado para indicar que um atributo deve ser acrescido para cada modelo na coleção. Este método aceita uma matriz de atributos ou apenas um único atributo:
$users->append('team');
$users->append(['team', 'is_admin']);
contains($key, $operator = null, $value = null)
O método contains
pode ser usado para determinar se uma determinada instância de modelo está contido na coleção. Este método aceita uma chave primária ou uma instância de modelo:
$users->contains(1);
$users->contains(User::find(1));
diff($items)
O método diff
retorna todos os modelos que não estão presentes na coleção fornecida:
use App\Models\User;
$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());
except($keys)
O método except
retorna todos os modelos que não possuem as chaves primárias dadas:
$users = $users->except([1, 2, 3]);
find($key)
O método find
retorna o modelo que possui uma chave primária igual à fornecida. Se a $key
for um modelo, o find
tentará retornar um modelo com a chave primária correspondente. Se o $key
for uma matriz de chaves, o find
retornará todos os modelos com chaves primárias na matriz:
$users = User::all();
$user = $users->find(1);
fresh($with = [])
O método fresh
recupera um modelo "novo" de cada item no banco de dados da coleção. Além disso, todos os relacionamentos especificados serão carregados previamente.
$users = $users->fresh();
$users = $users->fresh('comments');
intersect($items)
O método intersect
retorna todos os modelos que estão presentes na coleção dada.
use App\Models\User;
$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());
load($relations)
O método load
carrega todos os relacionamentos para todos os modelos na coleção:
$users->load(['comments', 'posts']);
$users->load('comments.author');
$users->load(['comments', 'posts' => fn ($query) => $query->where('active', 1)]);
loadMissing($relations)
O método loadMissing
carrega as associações dadas para todos os modelos na coleção se as associações já não estiverem carregadas:
$users->loadMissing(['comments', 'posts']);
$users->loadMissing('comments.author');
$users->loadMissing(['comments', 'posts' => fn ($query) => $query->where('active', 1)]);
modelKeys()
O método modelKeys()
retorna as chaves primárias para todos os modelos na coleção:
$users->modelKeys();
// [1, 2, 3, 4, 5]
makeVisible($attributes)
O método makeVisible
torna atributos visíveis que são normalmente "ocultos" em cada modelo na coleção:
$users = $users->makeVisible(['address', 'phone_number']);
makeHidden($attributes)
O método makeHidden
esconde os atributos que normalmente são "visíveis" no modelo de cada coleção:
$users = $users->makeHidden(['address', 'phone_number']);
only($keys)
O método only
retorna todos os modelos que possuem as chaves primárias dadas:
$users = $users->only([1, 2, 3]);
setVisible($attributes)
O método setVisible
substitui temporariamente todos os atributos visíveis de cada modelo na coleção:
$users = $users->setVisible(['id', 'name']);
setHidden($attributes)
O método setHidden
substituir temporariamente todos os atributos ocultos de cada modelo na coleção.
$users = $users->setHidden(['email', 'password', 'remember_token']);
toQuery()
A toQuery
retorna um objeto Eloquent query builder contendo uma restrição whereIn
nas chaves primárias do modelo da coleção:
use App\Models\User;
$users = User::where('status', 'VIP')->get();
$users->toQuery()->update([
'status' => 'Administrator',
]);
unique($key = null, $strict = false)
O método unique
retorna todos os modelos únicos na coleção; Quaisquer modelos com a mesma chave primária como outro modelo na coleção são removidos.
$users = $users->unique();
Coleções Personalizadas
Se você quiser usar um objeto Collection
personalizado quando interagindo com um modelo dado, você pode definir o método newCollection
no seu modelo.
<?php
namespace App\Models;
use App\Support\UserCollection;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Crie uma nova instância da Coleção Eloquent.
*
* @param array<int, \Illuminate\Database\Eloquent\Model> $models
* @return \Illuminate\Database\Eloquent\Collection<int, \Illuminate\Database\Eloquent\Model>
*/
public function newCollection(array $models = []): Collection
{
return new UserCollection($models);
}
}
Uma vez que você tenha definido um método newCollection
, você receberá uma instância de sua coleção personalizada sempre que o Eloquent normalmente retornar uma instância de Illuminate\Database\Eloquent\Collection
. Se você gostaria de usar uma coleção personalizada para cada modelo em seu aplicativo, você deve definir o método newCollection
em uma classe base do modelo que é estendida por todos os modelos do seu aplicativo.