Saltar al contenido

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"
  ]
]
*/
school Curso completo

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.

access_time 8 horas de contenido
layers 4 tecnologías en 1
update 100% actualizado
code Proyectos prácticos
Ver Curso Laravel 12 arrow_forward

star Incluido en cualquier suscripción

Rutas de aprendizaje