2015-10-15 10 views
11

を要求し、私は次のエラー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') - > NULL可能(); $ 卓上>文字列( '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

解決策ありがとうございます。ドロップカラムは常に可能ではないので、手動で変更する必要があります –

+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'); 
} 

これはVARCHAR()にすべてENUM列をマップし、列には任意の文字列を受け付けます。

これはLaravel 5.1とLaravel 5.3で私にとって役に立ちました。このバグがすぐに修正されることを願っています。

クレジット仕事は少ないがちょうどライン113上のこれらの行をadingによって

update Doctrine/DBAL/Schema/MySqlSchemaManager.php 

になり何をやっていない取得し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

でGmatkowskiの答え@本当の汚れたソリューションへ

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

ベンダーファイルdirの更新vonderがプラグインを更新することを選択した場合、変更は上書きされる可能性があるため、お勧めできません