我正在使用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可能不支持它。
知道我为什么会收到这个错误吗?我该怎么办呢?我需要在表格中重命名一列。有没有其他方法可以重命名该列?
答案 0 :(得分:20)
DB::getDoctrineSchemaManager()
->getDatabasePlatform()
->registerDoctrineTypeMapping('enum', 'string');
这适用于Laravel 5.1
答案 1 :(得分:15)
注意:不支持重命名
enum
列类型。
此处:https://github.com/laravel/framework/issues/1186
您可以找到有关此问题的一些解决方法。既然你说这个专栏不是enum
,请看看 @upngo 的评论:
“...问题是在具有
enum
的表格上重命名 ANY 列。”
此外,我发现这篇文章专注于此问题,并提出了一个可能对您有帮助的选项。
答案 2 :(得分:6)
我在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并再次尝试执行迁移命令,但是出现了下一个错误:
[学说\ 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`");
它有效。
P.S。要重命名表中包含枚举字段的其他字段,我们应该这样做 使用与之前的注释中所写的原始sql相同的模式。
答案 3 :(得分:4)
您可以向迁移添加自定义构造函数,并向Doctrine解释枚举应该被视为字符串。
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
}
答案 4 :(得分:1)
我在Laravel 5.1和PostGres上遇到了同样的问题。
所以基本上我使用DB::statement
来创建ENUM并解决问题:
DB :: statement(" CREATE TYPE e_users AS ENUM(' data1',' data2')");
然后:
DB :: statement(" ALTER TABLE users ADD COLUMN列e_users");
答案 5 :(得分:1)
虽然原作者在Laravel 4中存在问题,可以通过将doctrine/dbal
中的composer.json
版本提升为{{1}来安全地修复Laravel 5 },因为它已在版本2.6.0上的this PR中修复
答案 6 :(得分:0)
以下是Laravel 5.2.45+的答案(也可能在5.1中工作,尚未测试或检查过,请告诉我,以便我可以更新此问题。)
添加此行在你的方法:
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();
});
}
答案 7 :(得分:0)
当前,除了避免枚举之外,没有合法的解决方案,但是有一种解决方法:
使用以下内容创建迁移:
def inversing(column):
DF = pd.read_csv('DataFrame.csv')
DF[column] = DF[column].mask(DF[column] !=0, 1/DF[column])
columns_to_inverse = ['a','b','c']
inverting(columns_to_inverse)
这将解决您要查找的ENUM更新。此外,您可以创建处理向下函数以还原以前的字段状态:
public function up()
{
DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2', 'enum3+');");
}