Laravel db migration - renameColumn erreur Inconnu de la base de données de type enum demandé

J'utilise Laravel 4.2. J'ai le texte suivant de la bibliothèque est chargé 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 le type de colonne est text.

Quand je lance la migration, j'obtiens l'erreur suivante:

[DoctrineDBALDBALException] Unknown database type enum requested, DoctrineDBAL Platform MySqlPlatform peut ne pas le supporter.

N'importe quelle idée pourquoi je suis obtenez cette erreur? Comment puis-je corriger cela? Je dois renommer une colonne de ma table. Il y a un autre moyen de renommer la colonne?

15
demandé sur Latheesan 0000-00-00 00:00:00

7 réponses

documentation de Laravel dit:

Remarque:: Renommer enum les types de colonnes ne sont pas pris en charge.

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

vous pouvez trouver quelques solutions à ce problème. Et puisque vous avez dit que cette colonne n'est pas enum, jetez un oeil à @upngocommentaire:

"...Le problème est de rebaptiser colonne sur une table qui dispose d'un enum."

J'ai aussi trouvé cet article qui se concentre sur cette question 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
répondu Ivanka Todorova 2018-08-22 22:26:50
DB::getDoctrineSchemaManager()
    ->getDatabasePlatform()
    ->registerDoctrineTypeMapping('enum', 'string');

Cela fonctionne pour moi sur Laravel 5.1

19
répondu Gmatkowski 2018-08-22 22:27:55

J'ai rencontré ce problème dans Laravel version 5.1.19 (LTS). C'est aussi vrai pour les versions précédentes. Je voulais vous informer que j'ai résolu le problème de base sur les 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 commande php artisan migrate, j'ai obtenu l'erreur suivante:

[Symfony\Component\Debug\Exception\FatalErrorException] Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

Comme vous savez que le DBAL a été retiré du noyau laravel et nous avons besoin de l'ajouter au compositeur.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 la prochaine erreur:

[Doctrine\DBAL\DBALException]

Inconnu de la base de données de type enum demandé, Doctrine\DBAL \ Platform \ MySqlPlatform peut ne pas le supporter.

puis j'ai essayé le sql brut suivant dans mon fichier de migration: 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 ça fonctionne.

P.S. pour renommer d'autres champs dans la table qui contient un champ enum nous devrions utiliser le même schéma avec sql brut comme l'a écrit dans les commentaires précédents.

6
répondu Igor Gavryliv 2015-10-06 10:04:54

Vous pouvez ajouter un constructeur personnalisé à la migration et expliquer à la Doctrine qu'enum devrait être traité comme une chaîne.

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

    $this->platform->registerDoctrineTypeMapping('enum', 'string');
}
4
répondu luchaninov 2015-06-07 17:49:06

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

DB::énoncé("CREATE TYPE e_users COMME ENUM('data1','2')");

puis:

DB:: statement ("ALTER TABLE users ADD COLUMN column e_users");

1
répondu Deric Lima 2016-06-29 10:10:11

bien que L'auteur original ait eu des problèmes avec Laravel 4, cela peut être corrigé en toute sécurité dans Laravel 5 en cognant la version de doctrine/dbal dans votre composer.json^2.6, comme il a été fixé dans ce PR sur la version 2.6.0

assurez-vous de vérifier la compatibilité dernières modifications dans le communiqué de changelog

1
répondu DfKimera 2017-08-03 19:09:42

Voici la réponse pour Laravel 5.2.45+ (pourrait fonctionner en 5.1 ainsi, n'ont pas testé ou vérifié encore, s'il vous plaît laissez-moi savoir afin que je puisse mettre à jour cette question.)

Ajouter cette ligne dans vous de la méthode:

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

quelque Chose comme ceci:

public function up()
{
    Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
    Schema::table('users', function (Blueprint $table) {
         $table->text('bio')->change();
    });
}
0
répondu zeros-and-ones 2017-07-06 18:51:28