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

Lat*_*san 17 php mysql migration laravel laravel-4

我正在使用Laravel 4.2.我在我的文件中加载了以下库composer.json

"doctrine/dbal": "2.4.*",
Run Code Online (Sandbox Code Playgroud)

我创建了以下迁移:

class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration {

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

}
Run Code Online (Sandbox Code Playgroud)

delivery_notes列类型text.

当我运行迁移时,我收到以下错误:

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

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

Gma*_*ski 28

DB::getDoctrineSchemaManager()
    ->getDatabasePlatform()
    ->registerDoctrineTypeMapping('enum', 'string');
Run Code Online (Sandbox Code Playgroud)

这适用于Laravel 5.1

  • @Meriw当要重命名的列本身不是一个`ENUM()`*时,就像在OP的问题中一样,这个方法*不*将表上的任何`ENUM()`列更改为字符串类型或其他; 它仅影响要重命名的列. (3认同)
  • 不,你应该从你的迁移文件中运行它,最好是在构造方法中. (2认同)
  • 请注意,这会使列现在作为字符串工作,而不是枚举,因此允许保存任何字符串. (2认同)

Iva*_*ova 15

Laravel的文档说:

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

这里:https://github.com/laravel/framework/issues/1186

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

"...问题是在具有"." 的表上重命名任何enum.

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

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


Iho*_*liv 7

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

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

$table->renameColumn('column_name');
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

然后我在我的迁移文件中尝试了下一个原始sql:For 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`");
Run Code Online (Sandbox Code Playgroud)

用于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`");
Run Code Online (Sandbox Code Playgroud)

它的工作原理.

PS为了重命名包含枚举字段的表中的其他字段,我们应该使用与之前的注释中编写的原始sql相同的模式.


luc*_*nov 5

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

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

    $this->platform->registerDoctrineTypeMapping('enum', 'string');
}
Run Code Online (Sandbox Code Playgroud)