Gracias a PHP 8.1 los Enums en Laravel para operaciones Insert, Update y Where ya son soportados de forma nativa desde la versión 8.7.0 del framework. Esto es así desde hace pocos días gracias a este PR.
Yo desde hace mucho tiempo utilizo un paquete para Laravel que cubre todas las necesidades cuando trabajamos con Laravel y necesitamos gestionar Enumerables. Una vez se publique la versión 8.1 de PHP a partir del 25 de noviembre de 2021 voy a empezar a utilizar los Enums en Laravel de forma nativa, pero mientras tanto, veamos que podremos hacer con esta maravillosa novedad de Laravel y PHP.
Crear Enums en PHP 8.1
Crear un Enum en PHP 8.1 es muy sencillo.
<?php
namespace App\Enums;
enum PostType {
case Car;
case Course;
case Project;
}
Si lo deseamos, podemos definir el tipo de dato, aunque actualmente sólo están soportados los tipos int|string.
<?php
namespace App\Enums;
enum PostType: string {
case Car = 'car';
case Course = 'course';
case Project = 'project';
}Obtener todos los valores de un Enum
Si deseamos obtener todos los valores que contiene un Enum, podemos hacerlo gracias al método cases.
<?php
\App\Enums\PostType::cases();
/**
array:3 [▼
0 => App\Enums\PostType {#280 ▼
+name: "Car"
+value: "car"
}
1 => App\Enums\PostType {#274 ▼
+name: "Course"
+value: "course"
}
2 => App\Enums\PostType {#281 ▼
+name: "Project"
+value: "project"
}
]
*/Utilizar Enums en Migraciones Laravel
Actualmente no está soportado de forma nativa en Laravel, pero es fácil. Nosotros normalmente utilizamos Enums para definir tipos de datos, roles, post type y similares. Ya que es una tarea repetitiva, lo mejor sería reutilizar dicha tarea en todos nuestros Enums ¡Gracias por existir Traits!
<?php
namespace App\Enums;
trait BaseEnum {
public static function forMigration(): array {
return collect(self::cases())
->map(function ($enum) {
if (property_exists($enum, "value")) return $enum->value;
return $enum->name;
})
->values()
->toArray();
}
}El Trait BaseEnum cumple con nuestras necesidades, retornará un array de valores ideal para nuestras migraciones, ahora sólo debemos aplicarlo a nuestros Enums.
<?php
namespace App\Enums;
enum PostType: string {
use BaseEnum;
case Car = 'car';
case Course = 'course';
case Project = 'project';
}Migración con Enums Nativos en Laravel
Vamos a crear una migración para una tabla de Posts utilizando nuestro Enum PostType y su método forMigration.
<?php
use App\Enums\PostType;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePostsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string("title", 100)->unique();
$table->enum("post_type", PostType::forMigration())->default(PostType::Course->value);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
}Si revisas tu esquema, deberías ver algo como lo siguiente:
Crear registros con Enums en Laravel
Crear nuevos Posts utilizando nuestro Enum PostType es tan sencillo como sigue:
<?php
use App\Models;
Post::create([
"title" => "Nuevo curso",
]);
Post::create([
"title" => "Nuevo coche",
"post_type" => PostType::Car,
]);
Post::create([
"title" => "Nuevo proyecto",
"post_type" => PostType::Project,
]);
Post::create([
"title" => "Nuevo proyecto 2",
"post_type" => PostType::Project,
]);Filtrar Posts por Enum en Laravel
De la misma forma, filtrar por la columna post_type es bien sencillo gracias a nuestro Enum:
<?php
use App\Models\Post;
use App\Enums\PostType;
Post::wherePostType(PostType::Project)->get()->toArray();
/**
array:2 [▼
0 => array:5 [▼
"id" => 3
"title" => "Nuevo proyecto"
"post_type" => "project"
]
1 => array:5 [▼
"id" => 4
"title" => "Nuevo proyecto 2"
"post_type" => "project"
]
]
*/
Curso Laravel 12
Completo 2026
El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.
star Incluido en cualquier suscripción