7 coisas para você precisa aproveitar melhor o Model do Laravel.
A ideia deste artigo é apresentar sete dicas para que você possa aproveitar melhor o Model do Laravel.
Para recursos além dos mostrados aqui, basta entrar no repositório do Laravel e dar uma olhada na classe Model.
1. Vamos usar a linha de comando?
Ao baixarmos o Laravel ele já vem com o o model User
criado na pasta app
, porém muitas vezes preferimos que os models fiquem em na pasta app/models
, por questões de organização. A ferramenta de linha de comando do Laravel é muito versátil e nos permite informar em qual pasta queremos nossos models, bastando prefixar o nome do model com a pasta desejada, como abaixo:
php artisan make:model Models/Product
Assim você não precisa mover o arquivo manualmente, poupando um tempão enquanto desenvolve.
2. Visibilidade
Alguns atributos nem sempre devem aparecer no array e nem no JSON de um Model. Como exemplo mais usado, o atributo de senha de um usuário. Neste momento entra em ação a propriedade $hidden
.
protected $hidden = [
'password'
];
A propriedade $hidden
age como uma lista negra de atributos. Como alternativa, você pode usar a propriedade $visible
para adicionar atributos à lista de permissões.
protected $visible = [
'first_name',
'last_name'
];
Se $visible for definida no Model, então todas as propriedades adicionais passam a ser ocultadas. O mesmo vale para as propriedades $fillable
e $guarded
.
3. Accessors
Os Accessors servem para juntar múltiplos atributos em um ou apenas formatar algum atributo.
Digamos que nossa aplicação possui um Model chamado Customer e ele possui os atributos: address, address_number e city. Para exibir o endereço do cliente você poderia resolver como abaixo:
$this->address . ' ' . $this->address_number . ' ' . $this->city
É uma solução um tanto rasa, além de ter que repetir isso em todo lugar que for usar a informação do endereço do cliente. No Laravel a melhor maneira de resolver esse problema é com um Accessor. Os Accessors são definidos no Model com a seguinte sintaxe:
get[NameOfAttribute]Attribute
O Accessor para o endereço completo serial algo como:
public function getFullAddressAttribute() {
return "{$this->address} {$this->address_number} {$this->city}";
}
Para acessar o valor do Accessor basta chamá-lo da seguinte forma:
$user->full_address
4. Mutators
Bom eles permitem a manipulação e a atribuição do valor manipulado na propriedade $attribute
do Model. Os Mutators possuem a sintaxe semelhante aos Accessors.
public function setNameAttribute($value) {
$this->attributes['first_name'] = ucfirst($value);
}
O Mutator acima irá aplicar a função ucfirst ao nome, deixando-o com a primeira letra maiúscula e em seguida vai armazenar o valor na propriedade $attributes.
$user->name = 'pedro'; // Resultará em `Pedro`
5. Anexando valores
Quando um Model possui Accessors e Relacionamentos ele não são adicionados ao array e nem à representação JSON do Model. Para isso você deve adicionar a relação ou Accessor ao atributo $appends
.
$appends = [
'full_address'
];
Os Accessors adicionados ao atributo $appends
são referenciados com SnakeCase, mesmo que esteja definido no Model como CamelCase.
Os acessores adicionados ao atributo $ appends são referenciados no caso do cobra, mesmo que o acessador esteja definido no caso do camelo.
Agora vamos supor que no Customer Model tenhamos um relacionamento para muitos Order Model.
public function orders() {
return $this->hasMany(App\Order::class);
}
Para adicionar as Orders ao User Model você pode apenas adicionar ele ao atributo $appends
:
$appends = [
'full_address',
'orders'
];
E tem mais você ainda pode especificar os atributos de Order que quer que sejam adicionados. Digamos que você queira carregar os Customers com apenas a data e valor das Orders.
$appends = [
'full_address',
'orders:order_date,total'
];
6. Conversão de atributos
O atributo $casts
permite que você converta atributos para um certos tipos de dados.
protected $casts = [
'is_published' => 'boolean'
];
O atributo is_published
sempre será convertido para boolean quando você acessá-lo, mesmo que seja armazenado como um integer no banco de dados. São vários os tipos que você pode usar para converter seus atributos, como: date e datetime.
Ao invés de formatar a data no Blade como abaixo:
{{ $post->created_at->format('d/m/Y') }}
Você pode apenas fazer a conversão da seguinte forma para date e datetime:
protected $casts = [
'published_at' => 'datetime:d/m/Y',
];
Isso sempre retornará o atributo published_at
no formato d/m/Y, descartando a necessidade de realizar essa operação no Blade.
7. Touches
Quando um model possui os relacionamentos BelongsTo ou BelongsToMany com outro model. Como no caso de um model Comment que pertence a um model Blog. Em alguns casos pode ser interessante atualizar os timestamps do model pai quando o model filho é atualizado. E isso pode ser feito de maneira muito simples adicionando o relacionamento no atributo $touches
.
class Comment extends Model
{
protected $touches = ['blog']; public function blog()
{
return $this->belongsTo(App\Blog::class);
}
}
Quando o model Comment for atualizado, automaticamente o atributo updated_at
do model Blog também será atualizado.
Bom por hoje eu vou parando por aqui, essas foram as sete dicas que irão te ajudar a ganhar muito tempo enquanto desenvolvendo com o Laravel… até a próxima. 😎
Por favor, não deixem de compartilhar, comentar e deixar seu feedback.
Referências