Laravel 8 迁移 - 更改枚举值

标签 laravel enums database-migration laravel-8

我正在尝试使用 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 ,您会发现不支持更改枚举字段。如前所述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');

模型/枚举类型修复

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

您可以阅读官方学说项目网站页面 here它向您展示了如何从模型/枚举类型中做到这一点。

关于Laravel 8 迁移 - 更改枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64534892/

相关文章:

java - 重写 Java 中的枚举

grails - 为 Grails 数据库迁移文件将 grails 升级到 2.5.0 时出现类未找到错误

mysql - 用于带有存储例程的 mysql 的 Liquibase updateSQL

scala - 使用 Play 和 Slick 时,我应该如何处理数据库演变?我必须手动编写 SQL 吗?

angularjs - Laravel 和 AngularJS View 结构

javascript - Laravel 5.2 ajax 上传进度条和 VerifyCsrfToken.php 第 67 行中的 TokenMismatchException

grails - Redis(grails插件)不持久化枚举对象

Java 协变返回类型不适用于枚举实例的覆盖方法?

javascript - 使用 ajax 提交表单之前在 Laravel 中上传图像

php - 错误 "Trying to access array offset on value of type null"laravel 5.8.26 Php 7.4.2