2014-07-07 3 views
2

J'utilise ClosureTable pour Laravel. et j'ai un problème avec la migration.Impossible de migrer dans Laravel4 à l'aide de ClosureTable

C'est ce que mon script de migration ressemble:

// script de migration Page_Closure

public function up() 
{ 
    Schema::table('page_closure', function(Blueprint $table) 
    { 
     $table->engine = 'InnoDB'; 

     Schema::create('page_closure', function(Blueprint $t) 
     { 
      $t->increments('ctid'); 

      $t->integer('ancestor', false, true); 
      $t->integer('descendant', false, true); 
      $t->integer('depth', false, true); 
       //problem after this line. 
      $t->foreign('ancestor')->references('id')->on('pages'); 
      $t->foreign('descendant')->references('id')->on('pages'); 
     }); 
    }); 
} 

Une erreur se produit lorsque la clé étrangère est créée. IDK pourquoi, mais en fonction de ma ma file de migration "fermeture de page" s'exécute d'abord avant le script "page".

[Illuminate\Database\QueryException]                            
    SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'page_closure' already exists (SQL: create table `page_closure` (`ctid` int unsign 
    ed not null auto_increment primary key, `ancestor` int unsigned not null, `descendant` int unsigned not null, `depth` int unsigned not null) defa 
    ult character set utf8 collate utf8_unicode_ci) 

Répondre

2

En faisant Schema::table('page_closure', ...) puis Schema::create('page_closure', ...) à l'intérieur. Vous dites essentiellement à Laravel de trouver une table existante appelée page_closure, puis créez une table avec le même nom. C'est pourquoi vous obtenez l'erreur "Table 'page_closure' existe déjà". Vous n'avez pas besoin de la pièce Schema::table(). Il suffit de mettre votre $table->engine = 'InnoDB' dans votre Schema::create() comme ça ...

public function up() 
{ 
    Schema::create('page_closure', function(Blueprint $t) 
    { 
     $table->engine = 'InnoDB'; 

     $t->increments('ctid'); 
     // ... the rest of the columns 
    } 
} 

Il semble que votre table a déjà été créé, mais aussi la migration n'a pas été achevée. Donc, votre table de migration est probablement corrompue. Vous devrez supprimer la table manuellement et réexécuter la migration.

+0

Hi Unnawut, ce script de migration a été généré après l'échafaudage. "php artisan closuretable: make --entity = page" J'ai utilisé ce paquet https://github.com/franzose/ClosureTable. Donc, il doit y avoir quelque chose de mal avec l'échafaudage pour générer un script de migration avec cette erreur. – olleh

+1

@olleh Je pense que vous pourriez vouloir signaler un bug à eux alors. Il ne me semble pas correct d'avoir 'Schema :: table()' et 'Schema :: create()' du même nom de table l'un dans l'autre. Je pense que ce qui se passe dans le 'Schema :: table()' devrait être le nom de votre table d'entité, pas la table de fermeture. Peut-être que vous pouvez essayer de changer cela. – Unnawut