[英]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 上对我有用
注意:不支持重命名
enum
列类型。
这里: https : //github.com/laravel/framework/issues/1186
您可以找到有关此问题的一些解决方法。 既然你说这个列不是enum
,看看@upngo的评论:
“......问题是重命名具有
enum
的表上的任何列。”
我还发现这篇文章关注了这个问题,并提出了一个可能对你有帮助的选项。
我在 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");
目前,除了避免枚举之外,没有针对此问题的法律解决方案,但有一种解决方法:
使用以下命令创建迁移:
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.