Escolar Documentos
Profissional Documentos
Cultura Documentos
Docs » Eloquent
Eloquent ORM
Introdução
Uso Básico
Atribuição em Massa
Inserindo(Insert), Atualizando(Update), Removendo(Delete)
Exclusão Lógica
Timestamps
Escopo de Consultas
Escopo Global
Relacionamentos
Consultando Relacionamentos
Eager Loading(Carregamento Ansioso)
Inserindo em Modelos Relacionados
Atualizando Timestamps do modelo Pai
Trabalhando com Tabelas Pivot
Coleção
Accessors & Mutators
Mutators de Data
Conversão De Atributos
Eventos de Modelos
Observers de Modelos
Geração de URL a partir do Modelo
Convertendo para Arrays / JSON
Introdução
O Eloquent ORM incluido com o Laravel fornece uma bonita, e simples implementação
ActiveRecord para trabalhar com o seu banco de dados. Cada trabala do banco de dados tem a um
"Modelo" correspondente que é usado para interagir com determinada tabela.
Uso Básico
Para começar, crie um modelo Eloquent. Models tipicamente estão alocados no diretório app , mas
1 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
sinta-se livre para alocar em qualquer lugar que possar auto-carregado de acordo com o seu
arquivo composer.json . Todos os modelos eloquent herdam de Illuminate\Database\Eloquent\Model .
Note que nos não dizemos ao Eloquent que tabela ele deve usar para nosso modelo User . O "snake
case"(escrita separada por underline "_"), o nome no plural da classe que será usada como o nome
da tabela, a menos que outro nome seja explicitamente especi�cado. Então, neste caso, o Eloquent
assumirá que o modelo User armazenará registro na tabela users . Você pode especi�car uma
tabela customizada de�nindo a propriedade table no seu modelo:
Nota: O Eloquent irá também assumir que cada tabela tem a chave primária nomeada como
id . Você pode de�nir a propriedade primaryKey para sobrescrever esta convenção. Da mesma
forma, você pode de�nir a propriedade connection para sobrescrever o nome da conexão de
banco de dados que deve ser usada quando se estiver utilizando o modelo.
Uma vez que o modelo é de�nido, você está pronto para compeçar a recuperar e crair registros na
sua tabela. Note que você irá precisar por padrão alocar as colunas updated_at e created_at na sua
tabela. Se você não desejar ter estas colunas automaticamente mantidas, de�na a propriedade
$timestamps do seu modelo como false .
$users = User::all();
$user = User::find(1);
var_dump($user->name);
Note: Todos os métodos disponíveis no query builder também estão disponíves quando estiver
consultando modelos.
2 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
Recuparando Registros de Um Modelo Pela Chave Primária Ou Levante um Exceção
Algumas vezes você pode desejar levantar uma exceção se o modelo não for encontrado. Para fazer
isto, você pode usar o método firstOrFail :
$model = User::findOrFail(1);
Fazendo isto permitirá que você pegue a exeção então você pode registar(log) e monstrar uma
página de erro se necessário. Para pegar o ModelNotFoundException , adicionar aluma lógica ao seu
arquivo app/Exceptions/Handler.php .
use Illuminate\Database\Eloquent\ModelNotFoundException;
Agregados do Eloquent
É claro que, você pode também usar o construtor de consultas(query builder) para agregar funções.
Se você não incapacitado de gerar a consulta que você precisa pela interface �uente, sinta-se a
vontade para usar whereRaw :
Dividindo(Chunking) Resultados
Se você precisa processar muitos(milhares) de registros Eloquent, usando o comando chunk irá lhe
permitir fazer isto sem consumir toda a sua memoria RAM:
3 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
User::chunk(200, function($users)
{
foreach ($users as $user)
{
//
}
});
O primeiro argumento(parâmetro) passado para o método é o número de registro que você deseja
receber por "chunk" (divisão de resultados/partes). A Closure passada como o segundo argumento
irá ser chamada a cada parte "chunk" que for recuperada do banco de dados.
Você pode também especi�car que a conexão do banco de dados deve ser usada quando estiver
executando uma Consulta Eloquent. Simplesmente use o método on :
$user = User::on('connection-name')->find(1);
Se você estiver usando leia / escreva conexões, você pode forçar a query a usar a conexão "write"
com o seguinte método:
$user = User::onWriteConnection()->find(1);
Atribuição em Massa
Quando estivermos criando um novo modelo, você passa um array de atributos para o construtor
do mesmo. Estes atributos são atribuidos aos modelos via mass-assigment (atribuição em massa).
Isto é conveniente; no entanto, pode ser uma séria preocupação com segurança quando cegamente
estivermos passando o input do usuário a um modelo. Se o input do usuário é cegamente passado
ao modelo, o usuário é livre para modi�car qualquer e todo atributo do modelo.Por estas razões,
todos os modelos Eloquent são protegidos contra mass-assignment por padrão.
A propriedade fillable especi�ca que atributos devem ser atribuidos em massa. Isto pode ser
de�nido na classe ou a nível de instância.
4 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
De�nindo Atributos Guardados em um Modelo
O inverso de fillable é guarded , e server como uma "black-list" (lista negra) ao invés de uma
"white-list" (listra branca)
Nota: Quando usamos guarded , você ainda nunca deve passar Input::get() ou qualquer raw
array(array sem tratamento de acordo com os atributos) de entrada controlado pelo o usuário
para os métodos save ou update , como qualquer coluna que não for guarded poderá poderá
ser atualizada.
No exemplo acima, os atributos id e password não podem ter atribuição em massa. Todos os
outros atributos irão ser atribuídos em massa. Você pode também bloquear todos os atributos de
atribuição em massa usando a propriedade guard:
$user->name = 'John';
$user->save();
Nota: Tipicamente, seu modelo Eloquent irá ter chaves auto-incrementais. No entanto, se você
quiser especi�car suas próprias chaves, de�na a propriedade incrementing no seu modelo como
false .
Você também pode usar o método create para salvar um novo modelo um uma única linha. A
instância do modelo inserido será retornada para você a partir do método. No entanto, antes de
faze-lo, você precisará espe�car também os atributos fillable ou guarded no modelo, como todos
os modelos Eloquent protegidos contra atribuição-em-massa.
5 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
Depois de salver ou criar um novo modelo que use auto-incrementação de IDs, você pode
recuperar o ID acessando o atributo id do objeto:
$insertedId = $user->id;
Para atualizar um modelo, você pode recuperar isto, mudando o atributo, e usando o método save :
$user = User::find(1);
$user->email = 'john@foo.com';
$user->save();
Algumas vezes você pode desejar salvar não apenas o modelo, mas também todos os seus
relacionamentos. Para fazê-lo, você pode usar o método push :
$user->push();
6 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
$user = User::find(1);
$user->delete();
User::destroy(1);
User::destroy([1, 2, 3]);
User::destroy(1, 2, 3);
Claro que, você pode também executar uma query delete em um conjunto de modelos:
Se você desejar apenas atualizar os timestamps em modelo, você pode usar o método touch :
$user->touch();
Exclusão Lógica
Quando se esta excluindo lógicamente um modelo, isto na verdade não está sendo removido do seu
banco de dados. Ao invés, o timestamp deleted_at é de�nido no registro do banco de dados. Para
ativar a exclusão lógica para um modelo, aplique SoftDeletes no mesmo:
use Illuminate\Database\Eloquent\SoftDeletes;
use SoftDeletes;
Para adicionar a coluna deleted_at na sua tabela, você pode usar o método softDeletes a partir de
uma migração:
$table->softDeletes();
Agora, quando você chamar o método delete no modelo, a coluna deleted_at irá ser de�nida para
a data atual. Quando estivermos consultado um modelo que usar exclusão lógica, os modelos
"deletados" não serão incluídos nos resultados das consultas.
Para forçar modelos excluídos logicamente a aparecer em resultados das consultas, use o método
7 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
withTrashed na consulta:
$user->posts()->withTrashed()->get();
Se você desejar apenas receber modelos excluídos logicamente nos seus resultados de consulta,
você pode usar o método onlyTrashed :
Para recuperar um modelo excluído logicamente ao seu estado ativo, user o método restore :
$user->restore();
User::withTrashed()->where('account_id', 1)->restore();
Como com o método withTrashed , o método restore também pode ser usado em relacionamentos:
$user->posts()->restore();
Se você verdadeiramente deseja remover um modelo do seu banco de dados, você pode usar o
método forceDelete :
$user->forceDelete();
$user->posts()->forceDelete();
Para determinar se uma instância de um modelo dado foi excluída logicamente, você pode usar o
método trashed :
if ($user->trashed())
{
//
}
Timestamps
Por padrão, o Eloquent irá manter as colunas created_at e updated_at na tabela do seu bando de
8 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
dados automaticamente. Simplesmente adicionce essas colunas timestamp a sua tabela e o
Eloquent tomará conta do resto. Se você não desejar que o Eloquent não mantenha estas colunas,
adicione a seguinte propriedade para o seu modelo:
Se você deseja customizar o formato dos seus "timestamps", você pode sobrescrever o método
getDateFormat no seu modelo:
Escopo de Query(Consulta)
De�nindo o Escopo de Uma Consulta
Escopo lhe permite reúsar faicilmente a lógica de cosulta nos seus modelos. Para de�nir o escopo,
simplesmente pré�xe o método do modelo com scope :
$users = User::popular()->women()->orderBy('created_at')->get();
Escopo Dinâmico
9 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
Algumas vezes você pode desejar de�nir o escopo que aceite parâmetros. Apenas adicione seus
parâmetros a função de escopo:
$users = User::ofType('member')->get();
Escopo Global
Algumas vezes você pode desejar de�nir o escopo que aplique a todas as consultas feitas em um
modelo. Na essência, isto é como a característica "exclusão lógica"(sof delete) própria do Eloquent
funciona. Escopos globais são de�nidos usando a combinação de traits PHP e a implementação de
Illuminate\Database\Eloquent\ScopeInterface .
Primeiro, vamos de�nir a trait. Para este exemplo, nos irémos usar o SoftDeletes que vem com o
Laravel:
trait SoftDeletes {
/**
* Boot the soft deleting trait for a model.
*
* @return void
*/
public static function bootSoftDeletes()
{
static::addGlobalScope(new SoftDeletingScope);
}
Se um modelo Eloquent usa trait que tem um método que corresponda a convenção de
nomeclatura bootNameOfTrait (bootNomeDaTrait), esse método trait irá ser chamado quando o
modelo Eloquent é inicializado, dando a você a oportunidade de registrar um escopo global, ou
fazer quaalquer outra coisa que você queira. O escopo tem que implementar a ScopeInterface , que
especi�ca dois métodos: apply e remove .
/**
* Apply the scope to a given Eloquent query builder.
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function apply(Builder $builder, Model $model)
{
$builder->whereNull($model->getQualifiedDeletedAtColumn());
$this->extend($builder);
}
/**
* Remove the scope from the given Eloquent query builder.
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function remove(Builder $builder, Model $model)
{
$column = $model->getQualifiedDeletedAtColumn();
$query = $builder->getQuery();
$query->wheres = array_values($query->wheres);
}
}
}
Relacionamentos
É claro que, suas tabelas do banco de dados provavelmente tem algum relacionamento uma com as
outras, Por exemplo, um post de um blog pode muitos comentário, ou uma compra pode ser
relacionada a um usuário que a realizou. Eloquent faz o gerenciamento e o funcionamento com
esses relacionamentos de forma fácil. Laravel suporta vários tipos de relacionamentos.
Um para Um
Um para Many
Muitos para Muitos
Tem Muitos Através
Relações Polimór�cas
Muitos para Muitos Relações Polimór�cas
O primeiro argumento passado para o método hasOne é o nome do modelo relacionado. Uma vez
que o relaciomento é de�nido, nos podemos recuperar isto usando as propriedades dinâmicas do
Eloquent:
$phone = User::find(1)->phone;
Tome nota que o Eloquent assume que a chave estrangeira do relacionamento é baseado no nome
do modelo. Neste caso, o modelo Phone é assume usar a chave estrangeira user_id . Se você
desejar sobreescrever esta convenção, você pode passar um segundo argumento para o método
hasOne . Além disso, você pode passar um terceiro argumento para o método para especi�car qual
Para de�nir o inverso de um relaciomento no modelo Phone , nos usamos o método belongsTo :
Neste exemplo acima, o Eloquent irá olhar para coluna user_id na tabela phones . Se você quiser
de�nir uma coluna de chave estrangeira diferente, você pode passar isto como um segundo
argumento para o método belongsTo :
12 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
class Phone extends Model {
Adicionalmente, você passa um terceiro parâmetro que especi�ca o nome da coluna associada na
tabela pai:
Agora nos podemos acessar os comentários do post por meio das propriedades dinâmicas:
$comments = Post::find(1)->comments;
Se você precisar adicionar mais uma constraint aos comentários que são recuperados, você pode
chamar o método comments e continuar encadeando condições:
Para de�nir o relacionamento inverso o modelo Comment , nos usamos o método belongsTo :
13 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
class Comment extends Model {
$roles = User::find(1)->roles;
Se você gostar de usar um nome de tabela não-convencional para sua tabela pivot, você pode
passar isto como o segundo parâmetro do método belongsToMany :
É claro que, você pode também de�nir o inverso do relacionamento no modelo Role :
14 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
Tem Muitos Através
A relação "tem muitos através" fornece um atalho conveniente para acessar relações distantes por
meio de relações itermediárias. Por exemplo, o modelo Country pode ter muitos Post por meio do
modelo User . A tabela para este relacionamento deve parecer com isto:
countries
id - integer
name - string
users
id - integer
country_id - integer
name - string
posts
id - integer
user_id - integer
title - string
Mesmo que a tabela posts não contenha a coluna country_id , a relação hasManyThrough (tem-
muitos-atraves) nos permitirá acessar os post de um paíse(coutry's) via $country->posts . Vmoas
de�nir o relacionamento.
Relações Polimór�cas
Relações polimór�cas permitem ao modelo pertencer a mais do que um outro modelo, em uma
única associação. Por exemplo, você pode ter um modelo "photo"(foto) que pertece ou modelo
"staff"(pessoal) ou ao modelo "order"(pedido). Nos devemos de�nir esta relação assim:
15 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
class Photo extends Model {
Aora, nos podemos recuperar as fotos para um menbro da equipe/pessoal ou para um pedido:
$staff = Staff::find(1);
$photo = Photo::find(1);
$imageable = $photo->imageable;
A relação imageable no modelo Photo irá retornar a instância de Staff ou Order . dependendo do
tipo de modelo que possui a foto.
Para ajudar a entender como isto funciona, vamos explorar a estrutura do banco de dados para uma
relação polimór�ca:
16 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
staff
id - integer
name - string
orders
id - integer
price - integer
photos
id - integer
path - string
imageable_id - integer
imageable_type - string
posts
id - integer
name - string
videos
id - integer
name - string
tags
id - integer
name - string
taggables
tag_id - integer
taggable_id - integer
taggable_type - string
Em seguida, nos estamos prontos para con�gurar os relacionamentos no modelo. Os modelos Post
e Video irão ambos ter o relacionamento morphToMany por meio do método tags
Consultando Relacionamentos
Consultando Relacionamentos E Limitando seus Resultados
Quando se esta acessandos os registros de um demolo, você pode desejar limitar os resultandos
baseados nas existência do relacionamento. Por exemplo, você pode desejar pegar todos os posts
de um blog que tem pelo menos um comentário. Para isto, você pode usar o método has :
$posts = Post::has('comments')->get();
Declações has aninhadas podem também ser construídas usando a notação "dot":
$posts = Post::has('comments.votes')->get();
Se você precisar de ainda mais poder, você pode usar os métodos whereHas e orWhereHas para por
condições "where" nas suas consultas has :
})->get();
Propriedades Dinâmicas
Eloquent permite que você acesse as suas relações via propriedades dinâmicas. Eloquent irá
automaticamente carregar os relacionamento para você, e é mesmo inteligente o su�ciente para
saber se deve chamar o método get (para um-para-muitos relacionamentos) or first (para um-
para-um relacionamentos). Isto será então acessível via propriedade dinâmica pelo o mesmo nome
como relação. Por exemplo, como o seguinte modelo $phone :
18 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
class Phone extends Model {
$phone = Phone::find(1);
echo $phone->user()->first()->email;
echo $phone->user->email;
Nota: Relacionamentos que retornam muitos resultados irão retornar a instância da classe
Illuminate\Database\Eloquent\Collection .
Eager loading exists to alleviate the N + 1 query problem. For example, consider a Book model that
is related to Author . The relationship is de�ned like so:
Este laço irá executar 1 consulta para recuperar todos os livros da tabela, então outra consulta para
cada livro para recuperar o autor. Então, se tivermos 25 livros, este laço deve executar 26
consultas.
Felizment, nos podemos usar o carregamento ansioso para drasticamente reduzir o número de
consultas. Os relacionamentos que devem ser carregados asiosamente podem ser especi�cados via
19 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
o método with :
Claro que, você pode carregar ansiosamente relacionamentos múltiplos de uma vez:
$books = Book::with('author.contacts')->get();
Algumas vezes você pode desejar carregar ansiosamente um relacionamento, mas também
especi�car uma condição para o carregamento ansioso, aqui vai um exemplo:
}])->get();
Neste exemplo, nos estamos carregando ansiosamente os posts dos usuários, mas apenas se a
coluna título dos posts contém a palavra "�rst".
É claro que, Closures de arregamente ansioso não estão limitadas a "constraints". Você também
pode aplicar ordenações:
}])->get();
20 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
Carregamento Ansioso Tardio
$books = Book::all();
$books->load('author', 'publisher');
Você irá frequentement precisar iserir novos modelos relacionados. Por exemplo, você pode
desejar inserir um novo comentário para um post. Ao invés de manualmente de�nir a chave
estrangeira post_id no modelo, você pode inserir um novo comentário do seu pai o modelo Post
diretamente:
$post = Post::find(1);
$comment = $post->comments()->save($comment);
No exemplo acima, o campo post_id irá automaticamente ser de�nido no comentário inserido.
$comments = [
new Comment(['message' => 'A new comment.']),
new Comment(['message' => 'Another comment.']),
new Comment(['message' => 'The latest comment.'])
];
$post = Post::find(1);
$post->comments()->saveMany($comments);
When updating a belongsTo relationship, you may use the associate method. This method will set
the foreign key on the child model:
21 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
$account = Account::find(10);
$user->account()->associate($account);
$user->save();
Você pode também inserir modelos relacionados quando estiver trabalhando com relações muitos-
para-muitos (many-to-many). Vamos continuar usando nossos modelos User e Role como
exemplos. Nos podemos facilmente anexar novos roles "per�s" um user "usuário" usando o método
attach .
$user = User::find(1);
$user->roles()->attach(1);
Você pode também passar um array de atributos que devem ser armazenados na tabela pivot pra o
relacionamento:
$user->roles()->detach(1);
$user = User::find(1);
$user->roles()->detach([1, 2, 3]);
Você pode também usar o método sync para anexar modelos relacionados. O método sync
aceitar um array de IDs para alocar na tabela pivot. Depois que esta operação é completada, apenas
os IDs no arrau irão ser intermediadas para a tabela do modelo:
$user->roles()->sync([1, 2, 3]);
Você pode também associar outro valor de tabela pivot com os dados IDs:
22 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
Algumas vezes pode pode desejar criar um novo modelo relacionado e anexá-lo a um simples
comando. Para essa operação você pode usar o método save :
User::find(1)->roles()->save($role);
Neste exemplo, o novo modelo Role irá ser salvo e anexado ao modelo "user". Você pode também
passar um array de atributos para colocar na tabela que esta sendo associada para esta operação:
Agora, quando você atualiza o Comment (comentário), o Post pai irá ter a sua coluna updated_at
atualizada.
$comment = Comment::find(1);
$comment->save();
23 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
$user = User::find(1);
Note que cada modelo Role (per�l) que nos recuperamdnso é automaticamente atribuído um
atributo pivot . Este atributo contém um modelo representando a tabela intermediadora, e pode
ser usada como qualquer outro modelo Eloquent.
Por padrão, apenas as chaves poderão estar presentes no objeto pivot . Se sua tabela pivot contem
atributos extras, você tem que especi�cá-los quando estiver de�nindo os relacionamentos.
Agora os atributos, foo e bar serão acessíveis no nosso objeto pivot para o modelo Role .
Se você quer que sua tabela pivot tenha automaticamente manutenção dos timestamps created_at
return $this->belongsToMany('App\Role')->withTimestamps();
Para deletar todos os registros de uma tabela pivot para um modelo, você pode usar o metódo
detach :
User::find(1)->roles()->detach();
Note que esta operação não deleta os registros da tabela roles , mas apenas da tabela pivot.
Algumas vezes você pode precisar atualizar sua tabela pivot, mas não retira-la. Se você deseja
atualizar sua tabela pivot ao invés de deletar você pode usar o método updateExistingPivot assim:
User::find(1)->roles()->updateExistingPivot($roleId, $attributes);
Laravel também permite que você de�nar um modelo Pivot customizado. Para de�nir um modelo
customizado, primeiro crie seu própria classe modelo "Base" e extenda de Eloquent . Nos seus
outros modelos Eloquent, extenda este modelo base ao invés do modelo base Eloquent padrão. No
seu modelo base, adicione a seguinte função que retorna uma instância do seu pivot modelo pivot
customizado.
24 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
public function newPivot(Model $parent, array $attributes, $table, $exists)
{
return new YourCustomPivot($parent, $attributes, $table, $exists);
}
Coleções
Todos os conjuntos de multi-resultados retornados pelo ELoquent, que através do método get ou
do relacionamento , irão retornar um objeto collection. Este objeto implementa a interface PHP
IteratorAggregate então isto pode ser iterada como um array. No entanto, este objeto também tem
um variedade de outros métodos úteis para trabalhar com conjuntos de resultados.
Por exemplo, nos podemos determinar se um conjunto de resultados contém uma dada chave
primária, usando o método contains :
$roles = User::find(1)->roles;
if ($roles->contains(2))
{
//
}
$roles = User::find(1)->roles->toArray();
$roles = User::find(1)->roles->toJson();
Se a coleção é convertida para o tipo String, isto fará com que ela seja retornada como JSON:
Interando Coleções
Coleções Eloquent também contém alguns método úteis para interar e �ltrar os itens que as
coleções contém:
$roles = $user->roles->each(function($role)
{
//
});
Filtrando Coleções
Quando se �ltra coleções, o callback provido será usado como callback para array_�lter.
25 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
$users = $users->filter(function($user)
{
return $user->isAdmin();
});
Nota: Quando se está �ltrando coleções e as convertendo para JSON, tente chamar a função
values primeiro para resetar as chaves do array.
$roles = User::find(1)->roles;
$roles->each(function($role)
{
//
});
$roles = $roles->sortBy(function($role)
{
return $role->created_at;
});
$roles = $roles->sortByDesc(function($role)
{
return $role->created_at;
});
$roles = $roles->sortBy('created_at');
$roles = $roles->sortByDesc('created_at');
Algumas vezes, você pode querer retornar objetos coleção customizados com seus próprios
métodos adicionados. Você pode especi�car isto no seu modelo Eloquent sobrescrevendo o
método newCollection :
Eloquent fornece a meio conveniente para transformar seus atributos de modelo quando se está
recuperando ou os de�nindo. Simplesmente de�na o método getFooAttribute no seu modelo para
26 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
declarar um acessor. Fique ciente que os métodos devem serguir o modelo camel-casing, apesar
que as colunas colunas do banco de dados são no formato snake-case:
No exemplo acima, a coluna first_name tem o acessor. Note que o valor do atributo é passado para
o acessor.
De�nindo um Mutator
Mutators de Data
Por padrão, ELoquent irá converter as colunas created_at e updated_at para instâncias do Carbon,
que oferece uma variedade de métodos de úteis, e extendem classe nativa PHP DateTime .
Você pode customizar quais campos são automaticamente modi�cados, e até mesmo desativar
completamente esta modi�cação, sobrescrevendo o método getDates do modelo:
Quando a coluna é considerada data, você pode de�nir o seu valor para um timestamp UNIX, string
de dado ( Y-m-d ), date-time string, e é claro instância DateTime / `Carbon
Para desativar totalmente modi�cadores de data, simplemente retorne um array vazio do método
getDates :
27 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
Conversão De Atributos
Se você tiver alguns atributos que você queira sempre converter para outro tipo, você pode
adicionar o atributo para a propriedade casts do seu modelo. Caso contrário, você terá que de�nir
um mutator para cada um dos atributos, o que pode ser bem demorado. Aqui vai um exemplo de
uso da propriedade casts :
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'is_admin' => 'boolean',
];
Agora o atributo is_admin irá sempre ser convertido para o tipo booleano quando você acessá-lo,
mesmo se o valor de base é armazenado no banco de dados com inteiro. Outro tipo de conversão
suportados são: integer , real , float , double , string , boolean , object e array .
A conversão array é particularmente útil para trabalhar com colunas que são armazenadas como
JSON serializados. Por exemplo, se seu banco de dados tem um campo do tipo TEXT que contém
um JSON serializado, adicionando a conversão array para o atributo irá automaticamente
desserializar o atributo para um array PHP quando você acessá-lo no seu modelo ELoquent:
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'options' => 'array',
];
$user = User::find(1);
// $options is an array...
$options = $user->options;
Eventos De Modelo
Modelos Eloquent começam vários eventos, permitindo que você acesse vários pontos no ciclo de
vida do modelo usando os seguintes métodos:
creating , created , updating , updated , saving , saved , deleting , deleted , restoring , restored`.
Sempre que um item novo é salvo paela primeira vez , os eventos creating e created serão
28 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
iniciados. Se um item não é novo e o método save é chamado, o evento updating / updated será
chamado. Em ambos dos casos, o evento saving / saved será chamado.
Se é retornado false dos eventos creating , updating , saving , ou `deleting, a ação será
canceladas:
User::creating(function($user)
{
if ( ! $user->isValid()) return false;
});
Seu EventServiceProvider serve como um local conveniente para registrar o seu modelo de junção.
Por exemplo
/**
* Register any other events for your application.
*
* @param \Illuminate\Contracts\Events\Dispatcher $events
* @return void
*/
User::creating(function($user)
{
//
});
}
Observers de Modelos
Para consolidar a manipulação de eventos de modelos, você pode registrar um observer de modelo.
Uma classe observer pode ter métodos que correspondem a vários eventos de modelos. Por
exemplo, os métodos creating , updating , saving podem estar em um observer, adicionalmente a
qualquer outro nome de evento de modelos.
29 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
class UserObserver {
User::observe(new UserObserver);
Route::get('user/{user}', 'UserController@show');
action('UserController@show', [$user]);
Neste exemlpo a propriedade $user->id será inserida entre chave assim como neste padrão
{user} da URL gerada. No entando, se você gostar de usar outra propriedade ao invés do ID, você
pode sobrescrever o método getRouteKey do seu modelo:
Quando estiver desenvolvendo APIS JSON, você pode frequentemente precisar converter os
relacionamentos dos seus modelos para arrays ou JSON. Então, o Eloquent inclui métodos para
fazer isto. Para converter um modelo e seu relacionamento em um array, você pode usar o método
toArray :
$user = User::with('roles')->first();
return $user->toArray();
Note que todas as coleções dos modelos podem também ser convertidas em arrays:
return User::all()->toArray();
30 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
Convertendo um Modelo para JSON
Para converter um modelo para JSON, você pode usar o método toJson :
return User::find(1)->toJson();
Note que quando um modelo ou uma coleção é convertida para uma string, isto poderá ser
convertido para JSON, o que signi�ca que você pode retornar um objeto Eloquent diretamente das
rotas da sua aplicação!
Route::get('users', function()
{
return User::all();
});
Algumas vezes você pode querer limitar os atributos que estão incluídos no array ou no JSON form
do seu modelo, como nas senhas, Para fazê-lo, adicione a de�nição da propriedade hidden no seu
modelo:
Alternativamente, você pode usar a propriedade visible para de�nir uma white-list(faz o inverso
da black-list):
Ocasionalmente, você pode precisar adicionar atributos array que uma coluna correspondente no
seu banco de dados. Para fazê-lo, simplesmente de�na um accessor para o valor:
Uma vez que você tenha criado o acessor, apenas adicione o valor para a propriedade appends no
seu modelo:
31 of 32 24/02/2021 14:56
Eloquent - laravel-docs-pt-br https://laravel-docs-pt-br.readthedocs.io/en/latest/eloquent/#atribuicao-...
protected $appends = ['is_admin'];
Uma vez que o atributo tenha sido adicionado para a lista appends , isto será incluido em ambos os
forms array e JSON do modelo. Atributos no array appends respeitam a con�guração visible e
hidden do modelo.
32 of 32 24/02/2021 14:56