Laravel 中使用 Enum 枚举

老牛浏览 25评论 0发表于 更新于

一、写法示例

枚举可以使用 int 或者 string ,比如在音乐站点中音质枚举如下。

1.1 使用 int

php
namespace 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
        };
    }
}

1.2 使用 string

php
namespace 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 支持

✅ 完全支持

✅ 完全支持

三、查询示例

比如在前端,用户通过指定查询参数 qualityhigh 返回高品质的音频文件。

3.1 使用 int

php
$qualityLevel = SongQualityLevel::fromKey($request->query('quality'));
if (! $qualityLevel) {
    $qualityLevel = SongQualityLevel::High;
}

3.2 使用 string

php
$qualityLevel = SongQualityLevel::tryFrom(strtolower($request->query('quality', '')));
if (! $qualityLevel) {
    $qualityLevel = SongQualityLevel::High;
}

点赞
收藏
暂无评论,快来发表评论吧~
私信
老牛,俗称哞哞。单纯的九零后理工小青年。喜欢折腾,爱玩,爱音乐,爱游戏,爱电影,爱旅游...
最后活跃于