2015-03-20 11 views
15

Sto utilizzando Laravel 4.2. Ho la seguente libreria caricata nel mio composer.jsonLaravel db migration - renameColumn error - Richiesta di tipo di database sconosciuto enum

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

ho creato il seguente migrazione:

class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration { 

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

} 

Dove delivery_notes tipo di colonna è text.

Quando eseguo la migrazione, ottengo il seguente errore:

[Doctrine\DBAL\DBALException] Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

Qualsiasi idea perché sto ottenendo questo errore? Come dovrei andare a risolvere questo? Devo rinominare una colonna nella mia tabella. C'è un modo alternativo per rinominare la colonna?

+0

Credo che questo errore sia causato da un'altra migrazione, non esattamente questa. Dai un'occhiata alle migrazioni che hai e non sono ancora state eseguite. –

+0

Non ho altre migrazioni ancora da eseguire prima di questo. già controllato. – Latheesan

risposta

15

Ho cercato un po 'il problema e ho scoperto che si tratta di un problema noto.

docs di laravel (http://laravel.com/docs/4.2/schema#renaming-columns) dicono che

Note: Renaming enum column types is not supported.

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

Potete trovare alcune soluzioni su questo problema. E dal momento che lei ha detto che questa colonna non è enum, dare un'occhiata a @upngo commento s':

"...The issue is renaming ANY column on a table that has an enum ."

Inoltre ho trovato questo articolo che si concentra su questo problema e suggeriscono la possibilità che potrebbe aiutare.

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

4

È possibile aggiungere costruttore personalizzato per la migrazione e spiegare alla dottrina che enum deve essere trattato come stringa.

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

    $this->platform->registerDoctrineTypeMapping('enum', 'string'); 
} 
+0

Sembra non funzionante nelle versioni correnti? Sono su Laravel 5.1 – Volatil3

+0

stesso qui su Laravel 5.2 – Laurent

16

DB :: getDoctrineSchemaManager() -> getDatabasePlatform() -> registerDoctrineTypeMapping ('enum', 'stringa');

questo funziona per me su laravel 5.1

+0

dove eseguire questo comando? – Aditya

+0

Lo metti in una specie di file di bootstrap? –

+2

no, dovresti eseguirlo dal tuo file di migrazione, meglio in un metodo di costruzione. – Gmatkowski

6

Ho incontrato questo problema in laravel versione 5.1.19 (LTS). Questo è vero anche per le versioni precedenti. Volevo informarti come ho risolto il problema in base ai commenti precedenti.

Prima di tutto, ho provato il codice seguente nel mio file di migrazione:

$table->renameColumn('column_name'); 

Ma dopo il comando php artisan migrate, ho ottenuto il prossimo errore:

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

Come sapete DBAL è stato rimosso dal laravel core e abbiamo bisogno di aggiungerlo al compositore.json. (Ad esempio: "require": {"doctrine/dbal": "2.5.1"}). Ho impostato DBAL come richiesto e provato di nuovo a che fare comando migrare ma ho ottenuto prossimo errore:

[Doctrine\DBAL\DBALException]
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

Poi ho provato prossimo SQL prime nel mio file di migrazione: Per 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`"); 

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

e funziona.

P.S. Per rinominare altri campi nella tabella che contiene un campo enumerazione, dobbiamo utilizzare lo stesso schema con sql raw come è stato scritto nei commenti precedenti.

1

Ho avuto lo stesso problema con Laravel 5.1 e PostGres. Quindi, in pratica ho usato il DB::statement per creare l'ENUM e risolvere il problema:

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

E poi:

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

0

Ecco la risposta per laravel 5.2.45+ (potrebbe funzionare in 5.1 come pure , non sono testati o controllato ancora, per favore fatemelo sapere, così posso aggiornare questa domanda)

aggiungere questa riga in voi fino metodo:.

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

Qualcosa di simile a questo:

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

Anche se l'autore originale ha avuto problemi con laravel 4, questo può tranquillamente essere fissato in laravel 5 urtando la versione di doctrine/dbal nel vostro composer.json a ^2.6, come è stato fissato in this PR sul rilascio 2.6.0

Assicurati di assegno di compatibilità-rottura cambia nel release changelog

012.