laravel - 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?
谢谢
解决方案
解释
在这个主题上再详细说明一点。
如前所述, 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');
模型/枚举类型修复
我认为这个比上面提到的要简单得多,但仍然作为一个有效的选项存在,所以我会把它放在这里,
您可以在此处阅读官方的学说项目网站页面,该页面向您展示了如何从模型/枚举类型中进行此操作。
推荐阅读
- c# - 需要使用 C# 附加或编辑 ms 访问数据库的代码
- javascript - 在php Mysqli中通过带有jquery ajax的Bootstrap模式插入后数据不显示
- tensorflow - 重新训练 keras 模型
- java - 将 Spring Boot 应用程序作为 Docker 映像启动时无法解析配置类
- python - 如何使 Tkinter 中的分隔符填充整个窗口高度?
- android - 在 TransitionManager 动画中不可见的 UI 组件
- r - 通过拆分增加的值列来创建一列值
- c++ - Qt c++ 依赖组合框和依赖标签
- c++ - 在模板参数中使用静态 constexpr 成员数组作为指针
- parameters - Latex Tikz/Pgf 用参数声明形状,用数字声明锚点