Utilizando a propriedade cast do Laravel
A partir do PHP 5.1, se não me engano, o Laravel tem a opção de trabalhar com a propriedade cast em todos os Models que eu quiser, mas antes de explicar como usar, preciso te passar o que significa e como fazer um cast sem essa propriedade no Model.
Se você procurar no google a tradução de cast vai ver que significa elenco, isso não ajuda em nada, mas se procurar no google cast php
vai ver que já retornam vários sites sobre o assunto, e o que você vai perceber pelos exemplos dados, que cast nada mais é do que alterar o tipo de dados de uma variável.
Vou dar um exemplo para ficar bem claro.
$is_admin = 1; echo (string)$is_admin; // resultado '1'
Se você testar o exemplo acima, vai perceber que o retorno é o 1 entre aspas, ou seja, alterei o tipo de dados de um número inteiro para uma string.
Outro exemplo:
$person = ['name' => 'Alexandre','age' => 39]; $personObject = (object)$person; var_dump($personObject);
E nesse outro exemplo eu transformei um array em um objeto, se eu agora chamar $personObject->name
vai funcionar, porque alterei o tipo de dados, de um array para um objeto.
Sabendo disso já posso entrar no assunto do artigo, que é a propriedade cast dos Models.
Veja o Model abaixo.
class User extends Authenticatable { use HasApiTokens; use HasFactory; use Notifiable; /** * The attributes that are mass assignable. * * @var string[] */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for serialization. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast. * * @var array */ protected $casts = [ 'is_admin' => 'boolean' ]; }
Está vendo aquela propriedade $cast?.Ali é que vai acontecer a mágica da transformação de tipos, e eu já coloquei o is_admin => 'boolean'
, isso significa que vou transformar o que está no campo is_admin
da tabela no banco de dados em um valor booleano(true ou false), simples não?
O equivalente no ‘PHP puro’ é isso: (bool)$is_admin
.
Dê uma olhada na documentação e veja os tipos de dados para qual podemos alterar. clique aqui.
Quer outro exemplo ?Claro que quer.
protected $casts = [ 'is_admin' => 'boolean', 'created_at' => 'date:d/m/Y' ];
Nesse caso acima estou transformando o campo created_at
em um date com o formato d/m/Y
.
O equivalente no ‘PHP puro’ é isso:
$timestamp = strtotime($timestamp_vindo_do_banco); date('d/m/Y', $timestamp)
Agora se você for listar esses usuários(no blade) com o is_admin
e created_at
os valores não estarão no formato que eu coloquei no cast, e por que isso ?
Primeiro o created_at
, como o Eloquent por baixo dos panos retorna a instância do Carbon(para o created_at e updated_at) posso alterar o formato simplesmente colocando $user->created_at->format('d/m/Y')
diretamente no blade.
E o is_admin
vai mostrar no template(blade) o 1 e 0 e não true e false, mas você não concorda que o 1 e 0 já é considerado true e false quando colocamos em um if?.Então é desnecessário retornar o true e false para ser usado no blade, acho até que ficaria estranho.
Pense agora no seguinte cenário, eu tenho um json em um campo text la no banco de dados, e esse campo tem o nome de tags, e esse json é o seguinte: ["person","walk","talk"]
.
No Model User, na propriedade cast eu coloco:
protected $casts = [ 'is_admin' => 'boolean', 'created_at' => 'date:d/m/Y', 'tags' => 'array' ];
Agora no blade eu posso fazer o que quiser com esse array, por exemplo listar colocando uma virgula entre cada elemento. {{ implode(',',$user->tags) }}
E se você já está familiarizado com o Laravel sabe que podemos trabalhar com collections, e uma collection tem métodos utilíssimos, e adivinha, eu posso transformar esse campo tags em uma collection e usar os métodos la na view(blade), veja abaixo como:
protected $casts = [ 'is_admin' => 'boolean', 'created_at' => 'date:d/m/Y', 'tags' => 'collection' ];
E na view(blade) eu posso por exemplo, pegar somente o primeiro elemento usando o método first da collection:
{{ $user->tags->first() }}
Espero que tenha gostado desse artigo e aprendido como trabalhar com o cast, e aguarde que em breve colocarei a parte 2, onde mostrarei como criar o seu próprio cast.
Se quiser conhecer meu trabalho mais a fundo, visite meu canal no YouTube e se quiser um curso completo de Laravel 8 veja meu curso para iniciantes.
🔥 Canal no YouTube: Ir para o canal no YouTube
🔥 Curso de Laravel 8 para iniciantes: Ir para o curso
🔥Veja meus cursos disponíveis: Ir para a lista de cursos
0 Comments