Eloquent 支持数组枚举转换吗?

k0p*_*kus 9 laravel eloquent php-8

Eloquent 允许Enum Casting

Eloquent 还允许您将属性值转换为 PHP 枚举。为此,您可以在模型的 $casts 属性数组中指定要转换的属性和枚举:

use App\Enums\ServerStatus;

/**
 * The attributes that should be cast.
 *
 * @var array
 */
protected $casts = [
    'status' => ServerStatus::class,
];
Run Code Online (Sandbox Code Playgroud)

一旦在模型上定义了转换,当您与属性交互时,指定的属性将自动转换为枚举或从枚举转换:

if ($server->status == ServerStatus::provisioned) {
    $server->status = ServerStatus::ready;

    $server->save();
}
Run Code Online (Sandbox Code Playgroud)

是否可以在 eloquent 中对数组值使用枚举转换?

我有一个现有的雄辩模型,用于具有一种类型。现在它需要支持多个。

Laravel 是否支持数组枚举转换或者这不可能?实现类似目标的替代方法是什么?

Kur*_*ucu 6

从 Laravel v9+ 开始,现在可以转换枚举数组

use App\Enums\ServerStatus;
use App\Enums\ServerType;
use Illuminate\Database\Eloquent\Casts\AsEnumCollection;
use Illuminate\Database\Eloquent\Casts\AsEnumArrayObject;
 
/**
 * The attributes that should be cast.
 *
 * @var array
 */
protected $casts = [
    'statuses' => AsEnumCollection::class.':'.ServerStatus::class,
    'types' => AsEnumArrayObject::class.':'.ServerType::class,
];
Run Code Online (Sandbox Code Playgroud)


OMR*_*OMR 3

你可以使用spatie/laravel-enum

安装后:

composer require spatie/laravel-enum
Run Code Online (Sandbox Code Playgroud)

您可以将它用于数组枚举转换,例如:

protected $casts = [
    'status' => StatusEnum::class.':collection',
];
Run Code Online (Sandbox Code Playgroud)

如果status可以为空,您可以:

protected $casts = [
    'status' => StatusEnum::class.':collection,nullable',
];
Run Code Online (Sandbox Code Playgroud)

该包还提供验证规则和其他功能。

这是一个有趣的拉取请求,已被合并,但我没有测试它。