Laravel 10 Enum Model Attribute Casting Example

In Laravel, the Enum model attribute casting is used to map a model attribute to an enumeration type. Enums provide a way to define a set of named constants, which can be helpful when you have a specific set of allowed values for an attribute.

Step 1: Install Laravel

This is optional; however, if you have not created the laravel app, then you may go ahead and execute the below command: 

composer create-project laravel/laravel example-app

Step 2: Create Migration

Here, we need create database migration for "products" table with name, body and status columns and also we will create model for products table.

php artisan make:migration create_products_table

database/migrations/2022_07_11_141714_create_products_table.php

<?php
  
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
      
    return new class extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up(): void
        {
            Schema::create('products', function (Blueprint $table) {
                $table->id();
                $table->string('name');
                $table->text('body');
                $table->string('status')->default('pending');
                $table->timestamps();
            });
        }
      
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down(): void
        {
            Schema::dropIfExists('products');
        }
    };

Then run migration command to create items table.

php artisan migrate

Step 3: Create Enum Class

In this step, we will create ProductStatusEnum.php class and define all enum values. let's create model and update following code:

app/Enums/ProductStatusEnum.php

<?php
    namespace App\Enums;

    enum ProductStatusEnum:string {
        case Pending = 'pending';
        case Active = 'active';
        case Inactive = 'inactive';
        case Rejected = 'rejected';
    }

Step 4: Create Model

php artisan make:model Product

App/Models/Product.php

<?php
  
    namespace App\Models;
      
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use App\Enums\ProductStatusEnum;
      
    class Product extends Model
    {
        use HasFactory;
      
        /**
         * Write code on Method
         *
         * @return response()
         */
        protected $fillable = [
            'name', 'body', 'status'
        ];
      
        /**
         * Write code on Method
         *
         * @return response()
         */
        protected $casts = [
            'status' => ProductStatusEnum::class
        ];
    }

Step 5: Create Route

In third step, we will create one route for testing. so create one route here.

routes/web.php

<?php
 
    use Illuminate\Support\Facades\Route;
    use App\Http\Controllers\ProductController;
       
    /*
    |--------------------------------------------------------------------------
    | Web Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register web routes for your application. These
    | routes are loaded by the RouteServiceProvider within a group which
    | contains the "web" middleware group. Now create something great!
    |
    */
         
    Route::get('product-test', [ProductController::class, 'index']);

Step 6: Create Controller

In this step, we will create ProductController file and write index() method to create item records with array and access as array.

app/Http/Controllers/ProductController.php

<?php
  
    namespace App\Http\Controllers;
      
    use Illuminate\Http\Request;
    use App\Models\Product;
      
    class ProductController extends Controller
    {
        /**
         * Write code on Method
         *
         * @return response()
         */
        public function index()
        {
            $input = [
                'name' => 'Gold',
                'body' => 'This is a Gold',
                'status' => ProductStatusEnum::Active
            ];
      
            $product = Product::create($input);
      
            dd($product->status, $product->status->value);
      
        }
    }

Run Laravel App:

 Run the Laravel app: 

php artisan serve

Now, Go to web browser, type  URL and view the app output:

http://localhost:8000/product-test