Inicio » Blog »

6 abril, 2025

Propiedad $casts en un Modelo de Laravel

#Laravel

En este tutorial, exploraremos la propiedad protected $casts en Laravel, una herramienta poderosa de Eloquent que te permite transformar los datos de tu base de datos

Propiedad $casts en un Modelo de Laravel

Suscríbete a nuestro canal en Youtube

Suscríbirse

En este tutorial, exploraremos la propiedad protected $casts en Laravel, una herramienta poderosa de Eloquent que te permite transformar los datos de tu base de datos en tipos nativos de PHP. Aprenderás qué es, cómo funciona, los tipos de casteo disponibles y cómo aplicarla en un modelo real. ¡Empecemos!


¿Qué es $casts?

La propiedad $casts se define en un modelo Eloquent para especificar cómo deben convertirse los valores de las columnas de la base de datos cuando se accede a ellos o se asignan desde PHP. Esto asegura que trabajes con tipos de datos consistentes y simplifica tareas como manejar fechas, JSON o valores booleanos.

Por ejemplo, imagina que tienes una columna active en tu base de datos que almacena 0 o 1. Sin $casts, obtendrías un entero o una cadena, pero con $casts, puedes convertirlo automáticamente a true o false.


¿Por qué usar $casts?

  • Consistencia: Evita sorpresas con tipos de datos (¿es 1 un entero o una cadena?).
  • Facilidad: Simplifica el manejo de datos complejos como fechas o JSON.
  • Código limpio: Reduce la necesidad de conversiones manuales en tu lógica.

Sintaxis básica

En tu modelo, defines $casts como un array asociativo:

php

protected $casts = [ 'column_name' => 'type', ];

  • column_name: El nombre de la columna en la tabla.
  • type: El tipo de dato al que se convertirá (por ejemplo, boolean, float, datetime).

Tipos de casteo disponibles

Laravel ofrece varios tipos de casteo. Aquí están los más comunes con ejemplos:

1. boolean

Convierte valores a true o false.

  • Útil para: Columnas como active o is_correct.
  • Ejemplo:

    php

    protected $casts = [ 'active' => 'boolean', ];

    • 0, "0", null → false
    • 1, "1", true → true

2. integer

Convierte valores a enteros.

  • Útil para: IDs, órdenes, conteos.
  • Ejemplo:

    php

    protected $casts = [ 'order' => 'integer', ];

    • "5", 5.7 → 5

3. float o double

Convierte valores a números decimales.

  • Útil para: Puntajes, precios.
  • Ejemplo:

    php

    protected $casts = [ 'score' => 'float', ];

    • "85.5", 85 → 85.5

4. string

Convierte valores a cadenas.

  • Útil para: Nombres, descripciones.
  • Ejemplo:

    php

    protected $casts = [ 'name' => 'string', ];

    • 123, true → "123", "1"

5. array

Convierte JSON a un array PHP.

  • Útil para: Datos estructurados.
  • Ejemplo:

    php

    protected $casts = [ 'metadata' => 'array', ];

    • {"key": "value"} → ['key' => 'value']

6. datetime

Convierte fechas/horas a objetos Carbon.

  • Útil para: Columnas como created_at, completed_at.
  • Ejemplo:

    php

    protected $casts = [ 'completed_at' => 'datetime', ];

    • "2025-04-06 12:34:56" → Carbon object

Ejemplo práctico: Modelo QuizUser

Vamos a aplicar $casts en un modelo real basado en una aplicación de quizzes.

Paso 1: Crear la migración

Primero, definimos la tabla quiz_users:

bash

php artisan make:model QuizUser -m

Edita la migración (database/migrations/xxxx_create_quiz_users_table.php):

php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateQuizUsersTable extends Migration
{
    public function up()
    {
        Schema::create('quiz_users', function (Blueprint $table) {
            $table->id();
            $table->foreignId('quiz_id')->constrained()->onDelete('cascade');
            $table->foreignId('user_id')->constrained()->onDelete('cascade');
            $table->decimal('score', 5, 2); // Ej. 85.50
            $table->timestamp('completed_at')->nullable();
            $table->json('metadata')->nullable(); // Datos adicionales
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('quiz_users');
    }
}

Ejecuta la migración:

bash

php artisan migrate

Paso 2: Definir el modelo

Edita app/Models/QuizUser.php:

php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class QuizUser extends Model
{
    use HasFactory;

    protected $fillable = [
        'quiz_id',
        'user_id',
        'score',
        'completed_at',
        'metadata',
    ];

    protected $casts = [
        'quiz_id' => 'integer',      // Clave foránea como entero
        'user_id' => 'integer',      // Clave foránea como entero
        'score' => 'float',          // Puntaje como decimal
        'completed_at' => 'datetime', // Fecha como Carbon
        'metadata' => 'array',       // JSON como array
    ];

    public function quiz()
    {
        return $this->belongsTo(Quiz::class);
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Paso 3: Usar el modelo

Crear un registro

php

use App\Models\QuizUser;

$quizUser = QuizUser::create([
    'quiz_id' => 1,
    'user_id' => 2,
    'score' => 85.5,
    'completed_at' => now(),
    'metadata' => ['attempt' => 1, 'time_taken' => 300], // 300 segundos
]);

dd($quizUser->score);        // 85.5 (float)
dd($quizUser->completed_at); // Carbon object: "2025-04-06 12:34:56"
dd($quizUser->metadata);     // ['attempt' => 1, 'time_taken' => 300]

Consultar y usar en una vista

php

$quizUser = QuizUser::first();

En una vista Blade (resources/views/quiz-result.blade.php):

php

<p>Score: {{ $quizUser->score }}%</p>
<p>Completed: {{ $quizUser->completed_at->diffForHumans() }}</p>
<p>Attempt: {{ $quizUser->metadata['attempt'] }}</p>

Salida:

text

Score: 85.5% 
Completed: hace 2 horas 
Attempt: 1

Consejos avanzados

  1. Casteo personalizado:
    • Si necesitas lógica especial, crea una clase de casteo:

      bash

      php artisan make:cast ScoreCaster

      php

      namespace App\Casts;

      use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

      class ScoreCaster implements CastsAttributes
      {
          public function get($model, $key, $value, $attributes)
          {
              return number_format($value, 2) . '%'; // Ej. "85.50%"
          }

          public function set($model, $key, $value, $attributes)
          {
              return (float) $value; // Asegura que sea float
          }
      }

      Úsalo en el modelo:

      php

      protected $casts = [
          'score' => ScoreCaster::class,
      ];

  2. Combinar con $appends:
    • Agrega atributos calculados:

      php

      protected $appends = ['formatted_score'];

      public function getFormattedScoreAttribute()
      {
          return $this->score . '%';
      }

  3. Depuración:
    • Usa dd() o var_dump() para verificar los tipos:

      php

      dd(gettype($quizUser->score)); // "double" (float)


Conclusión

La propiedad $casts es una herramienta esencial en Laravel para transformar datos de la base de datos en tipos útiles en PHP. Con ella, puedes manejar booleanos, fechas, JSON y más de manera sencilla y segura. En este tutorial, aplicamos $casts al modelo QuizUser, pero puedes usarlo en cualquier modelo de tu aplicación.

¿Listo para mejorar tus modelos? ¡Prueba $casts en tu próximo proyecto y disfruta de un código más limpio y eficiente!


Leido 422 veces | 0 usuarios

Código fuente no disponible.

Compartir link del tutorial con tus amigos


Laravel Página Web Administrable

USD 37.00

Descarga del código fuente

Laravel Página Web Administrable

Codea Applications

México, Colombia, España, Venezuela, Argentina, Bolivia, Perú