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.
_
この列挙型を変更するにはどうすればよいですか?
使用 DB::statement
方法:
DB::statement("ALTER TABLE packages MODIFY COLUMN weight_unit ENUM('Grams', 'Kgs', 'Pounds')");
これは、変更された列挙列に新しい列挙値を追加するときに機能しました。
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");
_
注:列挙値を削除する前に、保持する別の列挙値に変更する必要があります。
マイグレーションにカスタムコンストラクターを追加し、Doctrineにenum
を文字列のように扱う必要があることを説明できます。
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
}
$table->enum('level', ['easy', 'hard']);
データを失いたくない場合そして新しい値で更新し、この解決策を思いつきました:
// 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')");
これにより、古い値を新しい値に置き換えることができます。