web-dev-qa-db-ja.com

Laravel db移行-renameColumnエラー-不明なデータベースタイプの列挙が要求されました

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はそれをサポートしていない可能性があります。

このエラーが発生する理由は何ですか?これを修正するにはどうすればよいですか?テーブルの列の名前を変更する必要があります。列の名前を変更する別の方法はありますか?

17
Latheesan

Laravelのドキュメント は次のように述べています:

enum列タイプの名前変更はサポートされていません。

ここ: https://github.com/laravel/framework/issues/1186

この問題に関するいくつかの回避策を見つけることができます。そして、この列はenumではないと言ったので、@ upngoのコメントを見てください:

"...この問題は、enumが含まれるテーブルの列の名前を変更しています[〜#〜] any [〜#〜]列」

また、私はこの問題に焦点を当てたこの記事を見つけ、あなたに役立つかもしれないオプションを提案しました。

http://www.paulbill.com/110/laravel-unknown-database-type-enum-requested-doctrinedbalplatformsmysqlplatform-may-not-support-it

16
Ivanka Todorova
DB::getDoctrineSchemaManager()
    ->getDatabasePlatform()
    ->registerDoctrineTypeMapping('enum', 'string');

これはLaravel 5.1で動作します

30
Gmatkowski

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で使用する必要があります。

7
Ihor Havryliv

カスタムコンストラクターを移行に追加し、列挙型を文字列のように扱う必要があることをDoctrineに説明できます。

public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
    parent::__construct($version);

    $this->platform->registerDoctrineTypeMapping('enum', 'string');
}
5
luchaninov

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();
    });
}
1
zeros-and-ones

私は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");

1
Deric Lima

元の作者はLaravel 4の問題を抱えていましたが、これはLaravel 5でバージョンdoctrine/dbalあなたのcomposer.jsonから^2.6、リリース2.6.0の this PR で修正されたため

必ず互換性を壊す変更を確認release changelog で確認してください

1
DfKimera