Проверка скалярного значения поддерживаемого перечисления в уникальной проверке Laravel, где предложение

В Laravel 9 с PHP 8.1 я не могу сравнить поддерживаемое перечисление в правилах проверки laravel, где вы можете использовать предложение ->where. Для сравнения требуется скалярное значение. Существуют ли другие способы сравнения с объектом перечисления, а не со скалярным значением?

      validator($attributes, [
    'manager_id' =>
        [
            'required',
            'integer',
            Rule::exists(User::getTableName(), 'id'),
            Rule::unique(JProject::getTableName(), 'manager_id')
                ->where('status', JProjectStatus::Active)
        ]
])->validate();

JProjectStatus — поддерживаемое перечисление

      enum JProjectStatus: string
{
    case Active = 'active';
    case Inactive = 'inactive';
    case Blocked = 'blocked';
}

Когда я пытаюсь проверить, уникален ли менеджер, где проект активен или нет, я столкнулся с ошибкой типа и полностью понимаю, что он сравнивает строку с объектом перечисления .

сообщение "str_replace(): аргумент № 3 ($subject) должен иметь тип array|string, App\Enums\JProjectStatus задан" исключение "TypeError"

Но если я напишу, как показано ниже, значение масштабирования, которое полностью подходит для str_replate().

      validator($attributes, [
'manager_id' => 
[
  'required', 
  'integer', 
  Rule::exists(User::getTableName(), 'id'),
  Rule::unique(JProject::getTableName(), 'manager_id')->where('status', JProjectStatus::Active->value)
]

])->validate();

Потому что теперь "JProjectStatus::Active->value" является скалярным значением "active"

Конечно, я могу передать закрытие в каком-либо состоянии, но хочу знать наилучшую практику. Мой вопрос: можно ли писать так, или есть ли другой способ написать передовую практику с объектом перечисления.

1 ответ

Да, это возможно, я использую свой backed enumэтим способом

      $request->validate([
    'state' => ['required', new Enum(ActiveStatus::class)],
]);

и импортируйте этот файл в контроллер

      use Illuminate\Validation\Rules\Enum;

Laravel Enums работает только с Laravel 9 с PHP-8.1.

Другие вопросы по тегам