Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

devhoussam123's avatar

How I can retrieve the default stored values from the status column in users table and use them in the Filament Select component with `->multiple()` select options.

Current Result I get:

Screenshot

Migration:

Screenshot

Component:

use App\Models\User;
use App\Enums\UserStatus;

...

Select::make('status')
    ->label(__('Status'))
    ->placeholder(__('Select Status'))
    ->multiple()
    ->options(UserStatus::class)
    ->searchable()
    ->preload()
    ->native(false)
    ->required()
    ->validationAttribute(__('status'))
    ->live()
    ->afterStateUpdated(fn (Livewire $livewire, Select $component) => $livewire->validateOnly($component->getStatePath())),

Model:

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\AsEnumCollection;
use App\Enums\UserStatus;

class User extends Model
{
    protected $casts = [
        'status' => AsEnumCollection::class . ':' . UserStatus::class,
    ];

    protected function status(): Attribute
    {
        return Attribute::make(
            get: function (string $value) {
                return Arr::accessible($value) || (Str::startsWith($value, '[') && Str::endsWith($value, ']'))
                    ? collect(json_decode($value, true))->map(function ($val) {
                        return UserStatus::tryFrom($val);
                    })->all()
                    : UserStatus::tryFrom($value);
            }
        );
    }
}

Enum:

<?php

namespace App\Enums;

use Filament\Support\Contracts\HasColor;
use Filament\Support\Contracts\HasIcon;
use Filament\Support\Contracts\HasLabel;

enum UserStatus: string implements HasColor, HasIcon, HasLabel
{
    case Open = 'open';
    case Active = 'active';
    case Inactive = 'inactive';
    case Restricted = 'restricted';
    case Closed = 'closed';

    public const Default = self::Open->value;

    public function getColor(): string | array | null
    {
        return match ($this) {
            self::Open => 'primary',
            self::Active => 'success',
            self::Inactive => 'info',
            self::Restricted => 'warning',
            self::Closed => 'danger',
        };
    }

    public function getIcon(): ?string
    {
        return match ($this) {
            self::Open => 'bi-door-open',
            self::Active => 'bi-toggle-on',
            self::Inactive => 'bi-toggle-off',
            self::Restricted => 'bi-patch-exclamation',
            self::Closed => 'bi-door-closed',
        };
    }

    public function getLabel(): ?string
    {
        return match ($this) {
            self::Open => __('Open'),
            self::Active => __('Active'),
            self::Inactive => __('Inactive'),
            self::Restricted => __('Restricted'),
            self::Closed => __('Closed'),
        };
    }
}
0 likes
1 reply
devhoussam123's avatar
devhoussam123
OP
Best Answer
Level 2

Solve it with

    protected function mutateFormDataBeforeFill(array $data): array
    {
        // Fetch the default status values from the UserStatus enum
        $defaultStatus = [UserStatus::Default];

        // If the user already has a status, fetch it from the data and merge it with the default values
        if (isset($data['status'])) {
            $defaultStatus = array_merge($defaultStatus, $data['status']);
        }

        // Set the 'status' key in the $data array with the merged default values
        $data['status'] = $defaultStatus;

        return $data;
    }

Please or to participate in this conversation.