Laravel 8 迁移 - 更改枚举值

Laravel 8 Migration - change enum values

我正在尝试使用 Laravel 迁移更改数据库中的枚举值。

首先,我尝试了这个经典的改变:

Schema::table('questionnaires', function ($table) {
    $table->enum('type', ['image', 'sound', 'video'])->nullable()->default('image')->change();
});

但我收到以下错误:

Unknown database type enum requested, Doctrine\DBAL\Platforms\MySQL57Platform may not support it

我通过直接执行 SQL 解决了我的问题:

DB::statement("ALTER TABLE questionnaires MODIFY COLUMN type ENUM('image', 'sound', 'video') DEFAULT 'image'");

但这对我来说似乎不是最佳选择...

在与Laravel 8的“约定”中是否有更多的解决方案, 没有经过纯 SQL?

谢谢

说明

详细说明这个主题。

如前所述here 无法将 ENUM 逆向工程为特定类型。每个 ENUM 都是它自己的一个值。因此,您必须明确告诉 Laravel ENUM 是哪种类型。

这似乎是所有版本 Laravel

的问题

在每个版本的文档中,即 https://laravel.com/docs/8.x/migrations#renaming-columns, you can find that changing enum fields is not supported. As noted here 迁移中的 DB 语句是目前最好的解决方法。

DB::statement("ALTER TABLE questionnaires MODIFY COLUMN type ENUM('image', 'sound', 'video') DEFAULT 'image'");

迁移文件修复

这个选项就是上面注释的GitHub link,建议你把这行代码放在真正迁移之前的up()迁移文件的方法里面。

DB::connection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');

Models/enum 类型修复

我认为这个比上面提到的要简单得多,但仍然是一个有效的选项,所以我会把它放在这里,

您可以阅读官方 doctrine-project 网站页面 here,其中向您展示了如何从模型/枚举类型中进行此操作。