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');
});
}
}
Où 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?
7 réponses
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.
DB::getDoctrineSchemaManager()
->getDatabasePlatform()
->registerDoctrineTypeMapping('enum', 'string');
Cela fonctionne pour moi sur Laravel 5.1
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.
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');
}
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");
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
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();
});
}