Php Laravel db迁移-重命名列错误-请求未知数据库类型枚举
我使用的是LaravelPhp Laravel db迁移-重命名列错误-请求未知数据库类型枚举,php,mysql,laravel,laravel-4,migration,Php,Mysql,Laravel,Laravel 4,Migration,我使用的是Laravel4.2。在我的composer.json中加载了以下库 "doctrine/dbal": "2.4.*", 我创建了以下迁移: class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration { public function up() { Schema::table('order_header', function(Blueprint $table)
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\u notes
列类型为text
运行迁移时,出现以下错误:
[Doctrine\DBAL\DBALException]请求了未知的数据库类型枚举,
条令\DBAL\Platforms\MySqlPlatform可能不支持它
知道我为什么会犯这个错误吗?我该如何着手解决这个问题?我需要重命名表中的一列。有没有其他方法可以重命名该列?说:
注意:不支持重命名枚举
列类型
在这里:
你可以找到一些解决这个问题的方法。既然你说这个专栏不是enum
,那么看看@upngo的评论:
“…问题是重命名具有enum
的表中的任何列。”
我还发现这篇文章关注这个问题,并提出了一个可能对您有所帮助的选项
您可以将自定义构造函数添加到迁移中,并向条令解释枚举应被视为字符串
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
}
这对我来说在Laravel 5.1上是有效的我在Laravel 5.1.19版(LTS)中遇到了这个问题。这对于早期版本也是实际的。
我想在根据之前的评论解决问题时通知您
首先,我尝试了迁移文件中的下一个代码:
$table->renameColumn('column_name');
但是在命令php artisan migrate
之后,我遇到了下一个错误:
[Symfony\Component\Debug\Exception\FatalErrorException]类
未找到“条令\DBAL\Driver\pdomsql\Driver”
正如您所知,DBAL已从laravel核心中删除,我们需要将其添加到composer.json中(例如:“require”:{“doctrine/DBAL”:“2.5.1”}
)。
我将DBAL设置为所需,并再次尝试执行migrate命令,但出现下一个错误:
[条令\DBAL\DBALException]
请求了未知的数据库类型枚举,
条令\DBAL\Platforms\MySqlPlatform可能不支持它
然后,我在迁移文件中尝试了下一个原始sql:
对于up()
:
对于down()
:
它是有效的
另外,要重命名包含枚举字段的表中的其他字段,我们应该
对原始sql使用与前面评论中所述相同的模式。我对Laravel5.1和PostGres也有同样的问题。
因此,基本上我使用了DB::statement
来创建枚举并解决问题:
语句(“创建类型e_用户为ENUM('data1','data2')”
然后:
语句(“ALTERTABLE users添加列e_users”)
以下是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 4有问题,这可以在Laravel 5中安全地解决,方法是将composer.json中的原则/dbal
版本升级到^2.6
,就像在2.6.0版中修复的那样
请确保检查中是否存在破坏兼容性的更改目前,除了避免枚举之外,没有解决此问题的法律解决方案,但有一个解决方法:
使用以下内容创建迁移:
public function up()
{
DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2', 'enum3+');");
}
这将完成您正在寻找的枚举更新。此外,您还可以创建句柄关闭函数,将字段状态恢复为以前的状态:
public function down()
{
DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2');");
}
我相信这个错误是由另一次迁移引起的,而不是这次迁移。看看您已经运行和尚未运行的迁移。在此之前,我没有其他迁移可以运行。已检查。在当前版本中似乎不可行?我是在Laravel 5.1上的,这里是在Laravel 5.2上的。您是否将其放入某种引导文件中?不,您应该从迁移文件中运行它,最好使用构造方法。请注意,这会使列现在作为字符串而不是枚举工作,因此允许保存任何字符串。@Meriw当要重命名的列本身不是enum()时
,与OP的问题一样,此方法不会将表上的任何ENUM()
列更改为字符串类型或其他类型;它只影响要重命名的列。@BenJohnson
public function up()
{
Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
Schema::table('users', function (Blueprint $table) {
$table->text('bio')->change();
});
}
public function up()
{
DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2', 'enum3+');");
}
public function down()
{
DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2');");
}