2015-10-15 68 views
11

在运行PHP人员迁移,我得到以下错误Laravel 5.1未知数据库类型枚举请求

[学说\ DBAL \ DBALException]
未知数据库类型枚举请求,学说\ DBAL \平台\ MySqlPlatform可能不支持它。

如何解决此问题。

代码:

public function up() { 
    Schema::table('blogs', function (Blueprint $table) { 
     $table->string('wordpress_id')->nullable(); 
     $table->string('google_blog_id')->nullable()->change(); 
    }); 
} 
+0

请发布您尝试迁移的模式。 – Adrenaxus

+0

公共功能了(){ 架构 ::表( '博客',函数(蓝图$表) {$ 表 - >字符串( 'wordpress_id') - >可以为空(); $ 表 - >字符串( 'google_blog_id') - > nullable() - > change(); }); } – karthick

+0

你的表是否包含一个'enum'列? – Adrenaxus

回答

18

官方Laravel 5.1 documentation状态:

注:与枚举列的表重命名列目前不支持。

,如果你想改变另一列,如果表中包含一个enum任何地方它不会工作没关系。这是一个Doctrine DBAL问题。

作为一种变通方法,你既可以放置列,并添加一个新的(列中的数据将会丢失):

public function up() 
{ 
    Schema::table('users', function(Blueprint $table) 
    { 
     $table->dropColumn('name'); 
    }); 

    Schema::table('users', function(Blueprint $table) 
    { 
     $table->text('username'); 
    }); 
} 

或使用DB声明:

public function up() 
{ 
    DB::statement('ALTER TABLE projects CHANGE slug url VARCHAR(200)'); 
} 

public function down() 
{ 
    DB::statement('ALTER TABLE projects CHANGE url slug VARCHAR(200)'); 
} 

来源: https://github.com/laravel/framework/issues/1186

+0

感谢您的解决方案,drop列并非总是可行,所以手动修改应该这样做 –

+0

如果您不使用'$ table',则不需要'DB :: statement'的'Schema'环绕。 – Jonathan

+0

真是无赖!我试图更新与枚举不相关的列,并且这是发送异常。好的,我猜这里的DB ::语句是最好的选择。谢谢。 – MarkSkayff

24

这是Laravel 5.1 documentation中所述的已知问题。

注:重命名在表中的列与列enum目前不支持。

它发生在数据库表中有enum列时。无论您是要重命名另一列还是将另一列更改为nullable,都会出现此错误。这是Doctrine\DBAL的问题。

一个简单修复因为这只是将此构造方法添加到您的数据库迁移文件中。

public function __construct() 
{ 
    DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); 
} 

这将所有ENUM列映射到VARCHAR(),并且列将接受任何字符串。

这在Laravel 5.1和Laravel 5.3上适用于我。我希望这个错误能很快解决。

感谢@ Gmatkowski的回答在https://stackoverflow.com/a/32860409/1193201

+6

这应该是公认的答案!谢谢@Xeleon – Ema4rl

+1

这会改变全局的类型映射,还是仅仅针对它指定的迁移? 如果它是全球性的,这是否会有其他副作用? 为了确保我使用了旧的Laravel 4方式,它也可以工作(http://laraveldaily.com/schema-builder-changing-table-columns-only-laravel-5-0/)。 –

2

一个真正的肮脏的解决方案,即能够完成任务没有少。将

update Doctrine/DBAL/Schema/MySqlSchemaManager.php 

通过ading略高于线113,这些线

$this->_platform->registerDoctrineTypeMapping('enum', 'string'); 
$type = $this->_platform->getDoctrineTypeMapping($dbType); 

请注意,更新供应商文件目录ectly是不可取的,因为如果vonder选择更新插件,您的更改可能会被覆盖