J'utilise Laravel 5.1 et j'ai une table appelée packages avec cette structure:
id int(11)
weight decimal(10,2)
weight_unit enum('Kg.', 'Gm.')
Je voudrais changer l'énumération weight_unit
En:
weight_unit enum('Grams','Kgs.','Pounds')
Pour cela je crée la migration suivante:
public function up()
{
Schema::table('packages', function ($table) {
$table->enum('weight_unit', array('Grams','Kgs.','Pounds'))->nullable()->change();
});
}
Mais lorsque j'exécute la migration, je reçois une erreur:
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform
may not support it.
Comment puis-je changer cette énumération?
Utilisez le DB::statement
méthode:
DB::statement("ALTER TABLE packages MODIFY COLUMN weight_unit ENUM('Grams', 'Kgs', 'Pounds')");
Cela a fonctionné pour moi lors de l'ajout d'une nouvelle valeur d'énumération à la colonne d'énumération modifiée.
Ajoutez ce qui suit à la méthode up()
:
DB::statement("ALTER TABLE packages MODIFY weight_unit ENUM('Grams', 'Kgs', 'Pounds', 'new value') NOT NULL");
Ensuite, dans la méthode down()
, vous pouvez annuler la modification effectuée:
DB::statement("ALTER TABLE packages MODIFY weight_unit ENUM('Grams', 'Kgs', 'Pounds') NOT NULL");
Remarque: avant de supprimer la valeur d'énumération, elle doit être remplacée par une autre valeur d'énumération qui sera conservée.
Vous pouvez ajouter un constructeur personnalisé à la migration et expliquer à Doctrine que enum
doit être traité comme une chaîne.
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
}
$table->enum('level', ['easy', 'hard']);
Au cas où vous ne voudriez pas perdre vos données et mettez-le à jour avec les nouvelles valeurs, j'ai trouvé cette solution:
// 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')");
De cette façon, vous pouvez remplacer vos anciennes valeurs par les nouvelles.