Laravel 数据库迁移 - renameColumn 错误 - 请求了未知的数据库类型枚举

Laravel db migration - renameColumn error - Unknown database type enum requested

我正在使用 Laravel 4.2。我的 composer.json

中加载了以下库
"doctrine/dbal": "2.4.*",

我创建了以下迁移:

class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration {

    public function up()
    {
        Schema::table('order_header', function(Blueprint $table)
        {
            $table->renameColumn('delivery_notes', 'packing_notes');
        });
    }

}

其中 delivery_notes 列类型为 text

当我 运行 迁移时,出现以下错误:

[Doctrine\DBAL\DBALException] Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

知道我为什么会收到此错误吗?我应该如何解决这个问题?我需要重命名 table 中的一列。是否有其他方法可以重命名该列?

Laravel's documentation 表示:

Note: Renaming enum column types is not supported.

此处:https://github.com/laravel/framework/issues/1186

您可以找到一些解决此问题的方法。既然你说这个专栏不是enum,那么看看@upngo的评论:

"...The issue is renaming ANY column on a table that has an enum."

我还发现这篇文章重点关注这个问题并提出了一个可能对您有帮助的选项。

http://www.paulbill.com/110/laravel-unknown-database-type-enum-requested-doctrinedbalplatformsmysqlplatform-may-not-support-it

您可以将自定义构造函数添加到迁移中,并向 Doctrine 解释枚举应该像字符串一样对待。

public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
    parent::__construct($version);

    $this->platform->registerDoctrineTypeMapping('enum', 'string');
}
DB::getDoctrineSchemaManager()
    ->getDatabasePlatform()
    ->registerDoctrineTypeMapping('enum', 'string');

这适用于我 Laravel 5.1

我在 Laravel 版本 5.1.19 (LTS) 中遇到了这个问题。这对于早期版本也是实际的。 当我根据之前的评论解决问题时,我想通知你。

首先,我尝试了迁移文件中的下一个代码:

$table->renameColumn('column_name');

但是在命令 php artisan migrate 之后,我得到了下一个错误:

[Symfony\Component\Debug\Exception\FatalErrorException] Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

如您所知,DBAL 已从 laravel 核心中删除,我们需要将其添加到 composer.json。(例如:"require": {"doctrine/dbal": "2.5.1"})。 我根据需要设置 DBAL 并再次尝试执行迁移命令但出现下一个错误:

[Doctrine\DBAL\DBALException]
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

然后我在我的迁移文件中尝试了 next raw sql: 对于 up():

DB::statement("ALTER TABLE `table_name` CHANGE `old_column_name` `new_column_name` ENUM('first value', 'second_value', ...) DEFAULT 'first_value' AFTER `some_field`");

对于down()

DB::statement("ALTER TABLE `table_name` CHANGE `new_column_name` `old_column_name` ENUM('first value', 'second_value', ...) DEFAULT 'first_value' AFTER `some_field`");

而且有效。

P.S。要重命名包含枚举字段的 table 中的其他字段,我们应该 使用与原始 sql 相同的模式,如先前评论中所写。

我在 Laravel 5.1 和 PostGres 上遇到了同样的问题。 所以基本上我使用 DB::statement 创建 ENUM 并解决问题:

DB::statement("CREATE TYPE e_users AS ENUM('data1','data2')");

然后:

DB::statement("ALTER TABLE users ADD COLUMN column e_users");

这是 Laravel 5.2.45+ 的答案(可能也适用于 5.1,尚未测试或检查,请告诉我,以便我更新此问题。)

在你的 up 方法中添加这一行:

Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');

像这样:

public function up()
{
    Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
    Schema::table('users', function (Blueprint $table) {
         $table->text('bio')->change();
    });
}

虽然原作者在 Laravel 4 中遇到了问题,这可以通过将 doctrine/dbal 的版本升级到 Laravel 5 中安全地修复您的 composer.json^2.6,因为它已在 2.6.0

版本的 this PR 中修复

确保 检查 release changelog

中的破坏兼容性的更改

目前,除了避免枚举外,没有针对此问题的合法解决方案,但有一个解决方法:

使用以下内容创建迁移:

public function up()
{
    DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2', 'enum3+');");
}

这将解决您正在寻找的 ENUM 更新。此外,您可以创建 handle down 函数来恢复以前的字段状态:

 public function down() 
 {
     DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2');"); 
 }