2015-10-15 67 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選擇更新插件,您的更改可能會被覆蓋