首页 > 解决方案 > Laravel 8 迁移 - 更改枚举值

问题描述

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

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

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

但我收到以下错误:

请求的未知数据库类型枚举,Doctrine\DBAL\Platforms\MySQL57Platform 可能不支持

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

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

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

与 Laravel 8 的“协议”是否有更多的解决方案,而无需通过纯 SQL?

谢谢

标签: laravelenumsdatabase-migrationlaravel-8

解决方案


解释

在这个主题上再详细说明一点。

如前所述 ENUM 不能被反向工程为某种类型。每个 ENUM 都是它自己的值。因此,您必须明确告诉 Laravel ENUM 是哪种类型。

这似乎是所有版本的 Laravel 的问题

在每个版本的文档中,即https://laravel.com/docs/8.x/migrations#renaming-columns,您会发现不支持更改枚举字段。如前所述,迁移中DB 语句是目前最好的解决方法。

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

迁移文件修复

此选项是上面注释的GitHub 链接,它建议您将这行代码放在up()迁移文件内部方法的实际迁移之前。

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

模型/枚举类型修复

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

您可以在此处阅读官方的学说项目网站页面,该页面向您展示了如何从模型/枚举类型中进行此操作。


推荐阅读