6 abril, 2025
Propiedad $casts en un Modelo de 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

Suscríbete a nuestro canal en Youtube
SuscríbirseEn 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
- 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)
Úsalo en el modelo:
{
return (float) $value; // Asegura que sea float
}
}php
protected $casts = [
'score' => ScoreCaster::class,
];
- Si necesitas lógica especial, crea una clase de casteo:
- Combinar con $appends:
- Agrega atributos calculados:
php
protected $appends = ['formatted_score'];
public function getFormattedScoreAttribute()
{
return $this->score . '%';
}
- Agrega atributos calculados:
- Depuración:
- Usa dd() o var_dump() para verificar los tipos:
php
dd(gettype($quizUser->score)); // "double" (float)
- Usa dd() o var_dump() para verificar los tipos:
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.