web-dev-qa-db-fra.com

Laravel migration de la base de données - erreur renameColumn - une énumération de type de base de données inconnue est demandée

J'utilise Laravel 4.2. J'ai la bibliothèque suivante chargée dans mon composer.json

"doctrine/dbal": "2.4.*",

J'ai créé la migration suivante:

class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration {

    public function up()
    {
        Schema::table('order_header', function(Blueprint $table)
        {
            $table->renameColumn('delivery_notes', 'packing_notes');
        });
    }

}

delivery_notes type de colonne est text.

Lorsque j'exécute la migration, l'erreur suivante apparaît:

[Doctrine\DBAL\DBALException] Énumération de type de base de données inconnue demandée, Doctrine\DBAL\Platforms\MySqlPlatform peut ne pas la prendre en charge.

Une idée de pourquoi je reçois cette erreur? Comment dois-je résoudre ce problème? Je dois renommer une colonne de ma table. Existe-t-il un autre moyen de renommer la colonne?

15
Latheesan

La documentation de Laravel dit que:

Remarque : Renommer les types de colonne enum n'est pas pris en charge.

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

Vous pouvez trouver des solutions de contournement à propos de ce problème. Et puisque vous avez dit que cette colonne n’est pas enum, jetez un coup d’œil au commentaire de @upngo :

"... Le problème est de renommer la colonneANYd'une table ayant une variable enum."

Aussi, j'ai trouvé cet article qui se concentre sur ce problème et suggère une option qui pourrait vous aider.

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

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

Cela fonctionne pour moi sur Laravel 5.1

19
Gmatkowski

J'ai rencontré ce problème dans Laravel version 5.1.19 (LTS). Ceci est également valable pour les versions précédentes. Je voulais vous informer que j'ai résolu le problème sur la base de commentaires précédents.

Tout d'abord, j'ai essayé le code suivant dans mon fichier de migration:

$table->renameColumn('column_name');

Mais après la commande php artisan migrate, j'ai l'erreur suivante:

[Symfony\Component\Debug\Exception\FatalErrorException] Classe 'Doctrine\DBAL\Driver\PDOMySql\Driver' introuvable

Comme vous le savez, DBAL a été supprimé du noyau Laravel et nous devons l’ajouter au fichier composer.json (par exemple: "require": {"doctrine/dbal": "2.5.1"}). J'ai défini DBAL comme requis et j'ai essayé à nouveau de faire la commande migrate mais j'ai eu l'erreur suivante:

[Doctrine\DBAL\DBALException]
Énumération de type de base de données inconnue demandée, Doctrine\DBAL\Platforms\MySqlPlatform peut ne pas la prendre en charge.

Ensuite, j'ai essayé le sql brut suivant dans mon fichier de migration: Pour 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`");

Pour 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`");

et il fonctionne.

P.S. Pour renommer d’autres champs de la table contenant un champ d’énumération, nous devons utiliser le même schéma avec le brut SQL que celui qui a été écrit dans les commentaires précédents.

6
Ihor Havryliv

Vous pouvez ajouter un constructeur personnalisé à la migration et expliquer à Doctrine que l'énumération doit être traitée comme une chaîne.

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

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

J'ai eu le même problème avec Laravel 5.1 et PostGres. Donc, fondamentalement, j'ai utilisé le DB::statement pour créer l'ENUM et résoudre le problème:

DB :: statement ("CREATE TYPE e_users AS ENUM ('data1', 'data2')");

Et alors:

DB :: statement ("Utilisateurs ALTER TABLE ADD COLUMN colonne e_users");

1
Deric Lima

Bien que l'auteur original ait eu des problèmes avec Laravel 4, ceci peut être corrigé en toute sécurité dans Laravel 5 en modifiant la version de doctrine/dbaldans votre composer.json en ^2.6 dans ce PR à la version 2.6.0

Assurez-vous de vérifier les modifications de compatibilité)dans le release changelog

1
DfKimera

Voici la réponse pour Laravel 5.2.45+ (pourrait également fonctionner en 5.1, n'a pas encore été testé ni vérifié, merci de me le faire savoir afin que je puisse mettre à jour cette question.)

Ajoutez cette ligne dans votre méthode:

Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');

Quelque chose comme ça:

public function up()
{
    Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
    Schema::table('users', function (Blueprint $table) {
         $table->text('bio')->change();
    });
}
0
zeros-and-ones