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

About the Author

Alexandre Eduardo Cardoso
Alexandre Eduardo Cardoso

Meu nome é Alexandre Cardoso e tenho 41 anos. Sou programador desde 2008, quando comecei a estudar e me especializar em PHP e Javascript. Já em 2011, dei minhas primeiras aulas de programação, e não consegui mais parar desde então. Ensinar é minha missão neste mundo!

0 Comments

Leave a comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *