Skip to content

Instantly share code, notes, and snippets.

@edgrosvenor
Created April 6, 2026 05:39
Show Gist options
  • Select an option

  • Save edgrosvenor/98ca97a83b954ba0b5b052f9e882a38e to your computer and use it in GitHub Desktop.

Select an option

Save edgrosvenor/98ca97a83b954ba0b5b052f9e882a38e to your computer and use it in GitHub Desktop.
Fat Enums: Polymorphic enum cast based on discriminator column
<?php
namespace App\Models;
use App\Enums\OrderStatus;
use App\Enums\TicketStatus;
use ArtisanBuild\FatEnums\Casts\AsPolymorphicEnum;
class Activity extends Model
{
protected $casts = [
// First arg: the discriminator column
// Second arg: map of discriminator values to enum classes
'status' => AsPolymorphicEnum::of('activity_type', [
'order' => OrderStatus::class,
'ticket' => TicketStatus::class,
]),
];
}
// Now the status column casts to different enums based on activity_type:
$orderActivity = Activity::where('activity_type', 'order')->first();
$orderActivity->status; // OrderStatus::Processing
$ticketActivity = Activity::where('activity_type', 'ticket')->first();
$ticketActivity->status; // TicketStatus::Open
// Perfect for activity logs, polymorphic relationships, or any
// table where one column's meaning depends on another column.
// Also available: AsNullableEnum for making any cast nullable
'status' => AsNullableEnum::of(OrderStatus::class),
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment