【问题标题】:Laravel 8 Migration - change enum valuesLaravel 8 迁移 - 更改枚举值
【发布时间】:2023-03-07 12:13:02
【问题描述】:

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

谢谢

【问题讨论】:

标签: laravel enums database-migration laravel-8


【解决方案1】:

说明

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

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,它向您展示了如何从模型/枚举类型中进行此操作。

【讨论】:

  • 感谢您的回归。但是有了这个,我有这个错误:请求未知的列类型“枚举”。您使用的任何 Doctrine 类型都必须在 \Doctrine\DBAL\Types\Type::addType() 中注册。您可以使用 \Doctrine\DBAL\Types\Type::getTypesMap() 获取所有已知类型的列表
  • 你使用的是哪个 Laravel 版本?
  • 我正在尝试 Laravel 8.9。我还尝试了 Laravel 6.6,结果相同
  • 是的,通过 Laravel 文档似乎每个版本都有这个问题。使用 DB 语句是目前最好的解决方法,我已经更新了我的答案以指出这一点。
猜你喜欢
  • 2014-10-04
  • 2021-07-01
  • 2022-09-27
  • 2015-09-01
  • 2022-10-30
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多