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はそれをサポートしていない可能性があります。
このエラーが発生する理由は何ですか?これを修正するにはどうすればよいですか?テーブルの列の名前を変更する必要があります。列の名前を変更する別の方法はありますか?
Laravelのドキュメント は次のように述べています:
注:
enum
列タイプの名前変更はサポートされていません。
ここ: https://github.com/laravel/framework/issues/1186
この問題に関するいくつかの回避策を見つけることができます。そして、この列はenum
ではないと言ったので、@ upngoのコメントを見てください:
"...この問題は、
enum
が含まれるテーブルの列の名前を変更しています[〜#〜] any [〜#〜]列」
また、私はこの問題に焦点を当てたこの記事を見つけ、あなたに役立つかもしれないオプションを提案しました。
DB::getDoctrineSchemaManager()
->getDatabasePlatform()
->registerDoctrineTypeMapping('enum', 'string');
これはLaravel 5.1で動作します
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を設定し、移行コマンドを実行しますが、次のエラーが発生しました:
[Doctrine\DBAL\DBALException]
不明なデータベースタイプ列挙が要求されました、Doctrine\DBAL\Platforms\MySqlPlatformはそれをサポートしていない可能性があります。
次に、移行ファイルで次の生のsqlを試しました:For 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`");
_
そしてそれは動作します。
追伸enumフィールドを含むテーブルの他のフィールドの名前を変更するには、前のコメントで記述したのと同じスキーマをraw sqlで使用する必要があります。
カスタムコンストラクターを移行に追加し、列挙型を文字列のように扱う必要があることをDoctrineに説明できます。
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
}
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 5.1とPostGresで同じ問題を抱えていました。基本的にDB::statement
ENUMを作成して問題を解決するには:
DB :: statement( "CREATE TYPE e_users AS ENUM( 'data1'、 'data2')");
その後:
DB :: statement( "ALTER TABLE users ADD COLUMN column e_users");
元の作者はLaravel 4の問題を抱えていましたが、これはLaravel 5でバージョンdoctrine/dbal
あなたのcomposer.json
から^2.6
、リリース2.6.0の this PR で修正されたため
必ず互換性を壊す変更を確認release changelog で確認してください