我正在尝试使用 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/