2015-10-15 19 views
11
angefordert

Während des Laufens php Handwerkers wandern, bekam ich folgende FehlermeldungLaravel 5.1 Unbekannte Datenbanktyp Enum

[Lehre \ DBAL \ DBALException]
Unbekannte Datenbanktyp Enum angefordert, Lehre \ DBAL \ Platforms \ MySqlPlatform unterstützt es möglicherweise nicht.

So beheben Sie dieses Problem.

Code:

public function up() { 
    Schema::table('blogs', function (Blueprint $table) { 
     $table->string('wordpress_id')->nullable(); 
     $table->string('google_blog_id')->nullable()->change(); 
    }); 
} 
+0

Bitte senden Sie das Schema migrieren Sie versuchen, überschrieben. – Adrenaxus

+0

public function nach oben() { Schema :: Tabelle ('Blogs', function ($ Blueprint-Tabelle) { $ table-> string ('wordpress_id') -> NULL festlegbare(); $ table-> string ('google_blog_id') -> nullable() -> change(); }); } – karthick

+0

Enthält Ihre Tabelle eine 'Enum'-Spalte? – Adrenaxus

Antwort

18

Die offizielle Laravel 5.1 documentation Zustände:

Hinweis: Umbenennen von Spalten in einer Tabelle mit einer ENUM-Spalte wird derzeit nicht unterstützt.

Es spielt keine Rolle, ob Sie eine andere Spalte zu ändern, sind versucht, wenn die Tabelle ein enumüberall enthält es nicht funktionieren wird. Es ist ein Doctrine DBAL-Problem.

Als Abhilfe können Sie entweder die Spalte fallen könnte und eine neue hinzufügen (Spaltendaten werden verloren):

public function up() 
{ 
    Schema::table('users', function(Blueprint $table) 
    { 
     $table->dropColumn('name'); 
    }); 

    Schema::table('users', function(Blueprint $table) 
    { 
     $table->text('username'); 
    }); 
} 

oder verwenden Sie eine DB-Anweisung:

public function up() 
{ 
    DB::statement('ALTER TABLE projects CHANGE slug url VARCHAR(200)'); 
} 

public function down() 
{ 
    DB::statement('ALTER TABLE projects CHANGE url slug VARCHAR(200)'); 
} 

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

+0

Danke für die Lösung, Tropfen Spalt nicht immer möglich ist, so manuelles Alter sollte es tun –

+0

Sie brauchen nicht die 'Schema' Verpackung um den' DB :: statement' wenn Sie nicht 'table' $ mit – Jonathan

+0

Ach wie schade! Ich habe versucht, eine Spalte zu aktualisieren, die nicht mit der Enumeration verknüpft ist, und sendet die Ausnahme. Ok, ich denke, die DB :: Anweisung ist hier die beste Option. Danke. – MarkSkayff

24

Es ist ein bekanntes Problem, wie in Laravel 5.1 documentation angegeben.

Hinweis: Umbenennen von Spalten in einer Tabelle mit einer enum Spalte wird derzeit nicht unterstützt.

Es passiert, wenn Sie eine enum Spalte in Ihrer Datenbanktabelle haben. Unabhängig davon, ob Sie eine andere Spalte umbenennen oder eine andere Spalte in nullable ändern möchten, wird dieser Fehler angezeigt. Es ist ein Problem mit Doctrine\DBAL.

Eine einfache Lösung für diese ist nur diese Konstruktormethode in Ihrer Datenbank Migrationsdatei hinzufügen.

public function __construct() 
{ 
    DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); 
} 

wird anzeigen Dieses alle ENUM Spalten VARCHAR(), und die Säule wird eine beliebige Zeichenfolge akzeptieren.

Dies funktionierte für mich auf Laravel 5.1 und Laravel 5.3. Ich hoffe, dass dieser Fehler bald behoben werden kann.

Credit @ Gmatkowski Antwort aufhttps://stackoverflow.com/a/32860409/1193201

+6

Dies sollte die akzeptierte Antwort sein! Vielen Dank @Xeleon – Ema4rl

+1

Ändert dies die Typzuordnung global oder nur für die Migration, in der es angegeben wird? Und wenn es global ist, wird dies irgendwelche anderen Nebenwirkungen haben? Um sicher zu sein ich die alte Laravel 4 Art und Weise verwendet, die auch (http://laraveldaily.com/schema-builder-changing-table-columns-only-laravel-5-0/) funktionieren. –

2

Eine echte schmutzige Lösung, die die Arbeit erledigt keine bekommt, desto weniger würde durch ading diese Zeilen gerade über der Linie

update Doctrine/DBAL/Schema/MySqlSchemaManager.php 

sein 113

$this->_platform->registerDoctrineTypeMapping('enum', 'string'); 
$type = $this->_platform->getDoctrineTypeMapping($dbType); 

Beachten Sie, dass die Aktualisierung der Herstellerdateien dir ekt ist nicht ratsam, weil im Falle der Vonder das Plugin aktualisieren wählt, können Sie Änderungen