繁体   English   中英

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

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

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

这在 Laravel 5.1 上对我有用

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

我在 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 并再次尝试执行 migrate 命令,但出现下一个错误:

[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`");

对于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`");

它有效。

PS 要重命名包含枚举字段的表中的其他字段,我们应该使用与之前评论中编写的原始 sql 相同的模式。

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

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

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

这是 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 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 4,这可以安全地通过碰撞的版本固定Laravel 5 doctrine/dbalcomposer.json^2.6 ,因为它是固定在这个PR的版本2.6.0

确保检查发布更改日志中的兼容性更改

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

使用以下命令创建迁移:

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

这将使用您正在寻找的 ENUM 更新来解决问题。 此外,您可以创建句柄向下函数来恢复字段状态,因为它曾经是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM