web-dev-qa-db-fra.com

Comment changer la colonne de type enum dans la migration laravel?

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?

19
Vinod VT

Utilisez le DB::statement méthode:

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

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.

12
Ray Hunter

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');
}
3
Peter Kota
$table->enum('level', ['easy', 'hard']);
1
Pablo Ramires

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.

0
Alberto