枚举可以使用 int 或者 string ,比如在音乐站点中音质枚举如下。
intnamespace App\Enums;
enum SongQualityLevel: int
{
case Low = 1;
case Standard = 2;
case High = 3;
case Lossless = 4;
public function label(): string
{
return match ($this) {
self::Low => '流畅',
self::Standard => '标准',
self::High => '高品质',
self::Lossless => '无损音质'
};
}
public static function fromKey(?string $key): ?self
{
if ($key === null) {
return null;
}
return match (strtolower($key)) {
'low' => self::Low,
'standard' => self::Standard,
'high' => self::High,
'lossless' => self::Lossless,
default => null
};
}
}stringnamespace App\Enums;
enum SongQualityLevel: string
{
case Low = 'low';
case Standard = 'standard';
case High = 'high';
case Lossless = 'lossless';
public function label(): string
{
return match ($this) {
self::Low => '流畅',
self::Standard => '标准',
self::High => '高品质',
self::Lossless => '无损音质'
};
}
}维度 | int enum | string enum |
|---|---|---|
数据库存储 | ✅ 小、快、索引友好 | ❌ 占用大 |
查询性能 | ✅ 最优 | ❌ 略慢 |
可读性(DB层) | ❌ 不直观 | ✅ 直观 |
重构成本 | ⚠️ 需要迁移 | ✅ 相对安全 |
拼写错误风险 | ✅ 无 | ❌ 有 |
前后端 / API 直观性 | ❌ 需映射 | ✅ 直接可用 |
Laravel Cast 支持 | ✅ 完全支持 | ✅ 完全支持 |
比如在前端,用户通过指定查询参数 quality 为 high 返回高品质的音频文件。
int$qualityLevel = SongQualityLevel::fromKey($request->query('quality'));
if (! $qualityLevel) {
$qualityLevel = SongQualityLevel::High;
}string$qualityLevel = SongQualityLevel::tryFrom(strtolower($request->query('quality', '')));
if (! $qualityLevel) {
$qualityLevel = SongQualityLevel::High;
}