7 coisas para você precisa aproveitar melhor o Model do Laravel.

Danilo Lutz
JunDevelopers
Published in
4 min readAug 14, 2019

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

--

--

Danilo Lutz
JunDevelopers

Obsessed for learning. OOP, PHP, C# and Python lover. Since 2003 coding...