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

时间:2015-03-20 11:16:49

标签: php mysql laravel laravel-4 migration

我正在使用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]请求未知的数据库类型枚举,   Doctrine \ DBAL \ Platforms \ MySqlPlatform可能不支持它。

知道我为什么会收到这个错误吗?我该怎么办呢?我需要在表格中重命名一列。有没有其他方法可以重命名该列?

8 个答案:

答案 0 :(得分:20)

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

这适用于Laravel 5.1

答案 1 :(得分:15)

Laravel's documentation说:

  

注意:不支持重命名enum列类型。

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

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

  

“...问题是在具有enum的表格上重命名 ANY 列。”

此外,我发现这篇文章专注于此问题,并提出了一个可能对您有帮助的选项。

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

答案 2 :(得分:6)

我在Laravel版本5.1.19(LTS)中遇到了这个问题。这对于早期版本也是如此。 我想通知你,因为我根据先前的评论解决了这个问题。

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

$table->renameColumn('column_name');

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

  

[Symfony \ Component \ Debug \ Exception \ FatalErrorException]类   找不到'Doctrine \ DBAL \ Driver \ PDOMySql \ Driver'

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

  

[学说\ DBAL \ DBALException]
  请求未知的数据库类型枚举,   Doctrine \ DBAL \ Platforms \ MySqlPlatform可能不支持它。

然后我在我的迁移文件中尝试了下一个原始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。要重命名表中包含枚举字段的其他字段,我们应该这样做 使用与之前的注释中所写的原始sql相同的模式。

答案 3 :(得分:4)

您可以向迁移添加自定义构造函数,并向Doctrine解释枚举应该被视为字符串。

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

    $this->platform->registerDoctrineTypeMapping('enum', 'string');
}

答案 4 :(得分:1)

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

  

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

然后:

  

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

答案 5 :(得分:1)

虽然原作者在Laravel 4中存在问题,可以通过将doctrine/dbal中的composer.json 版本提升为{{1}来安全地修复Laravel 5 },因为它已在版本2.6.0上的this PR中修复

确保在release changelog

检查兼容性更改

答案 6 :(得分:0)

以下是Laravel 5.2.45+的答案(也可能在5.1中工作,尚未测试或检查过,请告诉我,以便我可以更新此问题。)

添加此行在你的方法:

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();
    });
}

答案 7 :(得分:0)

当前,除了避免枚举之外,没有合法的解决方案,但是有一种解决方法:

使用以下内容创建迁移:

def inversing(column):
    DF = pd.read_csv('DataFrame.csv')
    DF[column] = DF[column].mask(DF[column] !=0, 1/DF[column])

columns_to_inverse = ['a','b','c']
inverting(columns_to_inverse)

这将解决您要查找的ENUM更新。此外,您可以创建处理向下函数以还原以前的字段状态:

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