Laravel db 迁移 - renameColumn 错误 - 请求了未知的数据库类型枚举
Posted
技术标签:
【中文标题】Laravel db 迁移 - renameColumn 错误 - 请求了未知的数据库类型枚举【英文标题】:Laravel db migration - renameColumn error - Unknown database type enum requested 【发布时间】:2015-05-23 18:53:49 【问题描述】:我正在使用 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 可能不支持。
知道为什么我会收到此错误吗?我应该如何解决这个问题?我需要重命名表中的列。有没有其他方法可以重命名列?
【问题讨论】:
我相信这个错误是由另一个迁移引起的,不完全是这个。看看你已经和尚未运行的迁移。 在此之前,我没有其他迁移要运行。已经检查过了。 【参考方案1】:DB::getDoctrineSchemaManager()
->getDatabasePlatform()
->registerDoctrineTypeMapping('enum', 'string');
这适用于 Laravel 5.1
【讨论】:
你把它放在某种引导文件中吗? 不,你应该从你的迁移文件中运行它,最好在构造方法中。 请注意,这会使列现在作为字符串工作,而不是枚举,因此允许保存任何字符串。 @Meriw 当要重命名的列本身不是ENUM()
时,就像OP 的问题中的情况一样,此方法不是 将表格上的任何ENUM()
列更改为字符串类型或其他类型;它只影响要重命名的列。
@BenJohnson 很棒的东西【参考方案2】:
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
【讨论】:
【参考方案3】:我在 Laravel 版本 5.1.19 (LTS) 中遇到了这个问题。这也是早期版本的实际情况。 我想在根据以前的 cmets 解决问题时通知您。
首先,我尝试了迁移文件中的下一个代码:
$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 并再次尝试执行迁移命令,但出现下一个错误:
[Doctrine\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`");
它有效。
附:为了重命名包含枚举字段的表中的其他字段,我们应该 使用与之前 cmets 中编写的原始 sql 相同的架构。
【讨论】:
【参考方案4】:您可以将自定义构造函数添加到迁移中,并向 Doctrine 解释枚举应该像字符串一样对待。
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
【讨论】:
在当前版本中似乎无法使用?我在 Laravel 5.1 在 Laravel 5.2 上也一样【参考方案5】:这是 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();
);
【讨论】:
【参考方案6】:我在使用 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");
【讨论】:
【参考方案7】:虽然原作者对 Laravel 4 有问题,可以通过将 composer.json
中的 doctrine/dbal
版本提升到 ^2.6
来安全地在 Laravel 5 中修复,因为它已修复在 this PR 发布 2.6.0
确保检查release changelog中的兼容性更改
【讨论】:
【参考方案8】:目前,除了避免枚举之外,这个问题没有合法的解决方案,但是有一个解决方法:
使用以下内容创建迁移:
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');");
【讨论】:
以上是关于Laravel db 迁移 - renameColumn 错误 - 请求了未知的数据库类型枚举的主要内容,如果未能解决你的问题,请参考以下文章
Laravel db 迁移 - renameColumn 错误 - 请求了未知的数据库类型枚举
Laravel 5.1 如何使用迁移创建 MySQL 存储过程