web-dev-qa-db-ja.com

laravel移行で列挙型の列を変更する方法?

Laravel 5.1 を使用していますが、この構造を持つpackagesというテーブルがあります:

_id              int(11)
weight          decimal(10,2)           
weight_unit     enum('Kg.', 'Gm.')
_

_weight_unit_ enumを次のように変更したいと思います。

weight_unit enum('Grams','Kgs.','Pounds')

このために、次の移行を作成します。

_public function up()
{
    Schema::table('packages', function ($table) {
        $table->enum('weight_unit', array('Grams','Kgs.','Pounds'))->nullable()->change();
    });
}
_

しかし、移行を実行するとエラーが表示されます。

_Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform  

may not support it.
_

この列挙型を変更するにはどうすればよいですか?

19
Vinod VT

使用 DB::statement 方法:

DB::statement("ALTER TABLE packages MODIFY COLUMN weight_unit ENUM('Grams', 'Kgs', 'Pounds')");
23
Jake Conner

これは、変更された列挙列に新しい列挙値を追加するときに機能しました。

up()メソッドに次を追加します。

_DB::statement("ALTER TABLE packages MODIFY weight_unit ENUM('Grams', 'Kgs', 'Pounds', 'new value') NOT NULL");
_

次に、down()メソッドで、行われた変更を元に戻すことができます。

_DB::statement("ALTER TABLE packages MODIFY weight_unit ENUM('Grams', 'Kgs', 'Pounds') NOT NULL");
_

注:列挙値を削除する前に、保持する別の列挙値に変更する必要があります。

12
Ray Hunter

マイグレーションにカスタムコンストラクターを追加し、Doctrineにenumを文字列のように扱う必要があることを説明できます。

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

    $this->platform->registerDoctrineTypeMapping('enum', 'string');
}
3
Peter Kota
$table->enum('level', ['easy', 'hard']);
1
Pablo Ramires

データを失いたくない場合そして新しい値で更新し、この解決策を思いつきました:

// Include old and new enum values
DB::statement("ALTER TABLE packages MODIFY COLUMN weight_unit ENUM('Kg.', 'Gm.', 'Grams', 'Kgs', 'Pounds')");
// Replace Kg. with Kgs
Packages::where('weight_unit', 'Kg.')->update(['weight_unit' => 'Kgs']);
// Replace Gm. with Grams
Packages::where('weight_unit', 'Gm.')->update(['weight_unit' => 'Grams']);
// Delete old values
DB::statement("ALTER TABLE packages MODIFY COLUMN weight_unit ENUM('Grams', 'Kgs', 'Pounds')");

これにより、古い値を新しい値に置き換えることができます。

0
Alberto