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