2017-09-12 6 views
0

Je travaille sur certaines migrations de base de données dans Laravel 5.4. Les migrations fonctionnent correctement avec une base de données MySQL, mais pour tester, je veux utiliser SQLite mais la migration échoue. Voici le codeSQLite ne crée pas d'index

public function up() 
    { 
     Schema::create('mapped_venues', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->unsignedInteger('upload_job_id')->nullable(); 
      $table->string('venue')->default(''); 
      $table->unsignedInteger('venue_id')->nullable(); 

      $table->timestamps(); 

      $table->index(['venue']); 
     }); 

     Schema::create('mapped_teams', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->unsignedInteger('upload_job_id')->nullable(); 
      $table->string('team')->default(''); 
      $table->unsignedInteger('team_id')->nullable(); 

      $table->timestamps(); 

      $table->index(['team']); 
     }); 
    } 

Quand je lance php artisan migrate l'index sur la colonne mapped_teams.team n'est pas créée, mais celui sur mapped_venues.venue est !!

$ sqlite3 database/database.sqlite 
SQLite version 3.19.3 2017-06-08 14:26:16 
Enter ".help" for usage hints. 
sqlite> .indexes mapped_teams 
sqlite> .indexes mapped_venues 
mapped_venues_venue_index 
sqlite> 

J'ai aussi essayé de créer des index sur un appel séparé

Schema::table('mapped_venues', function (Blueprint $table) { 
      $table->index(['venue']); 
     }); 
Schema::table('mapped_teams', function (Blueprint $table) { 
      $table->index(['team']); 
     }); 

Mais le résultat est le même. Fait intéressant cependant, quand (par erreur) j'ai quitté la création de l'index $table->index['team']) à l'intérieur de l'appel pour créer la table (donc, j'ai deux appels pour créer l'index) J'ai l'erreur que l'indice existe déjà.

J'utilise:

  • Laravel 5.4.36
  • Doctrine Dbal 2.6.2
  • SQLite 3.19.3

Répondre

1

Il semble que vous avez petite erreur lorsque vous appelez l'index function (utilisé comme un tableau au lieu d'une fonction):

$table->index['venue']; 

devrait être:

$table->index('venue'); 
+0

Merci @ inet123, c'était juste une faute de frappe sur la question. Le code actuel est correct. J'ai édité la question cependant. – giuliot

0

J'ai effectivement découvert que l'indice a en effet été créé. J'ai eu une autre migration pour renommer la colonne team-mapped_team, et je voulais supprimer l'index premier

Schema::table('mapped_teams', function (Blueprint $table) { 
    $table->dropIndex(['team']); 
    $table->renameColumn('team', 'mapped_team'); 
    $table->index(['mapped_team']); 
} 

La ligne où est tombé l'indice se plaignait que l'indice mapped_teams_team_index n'existait pas. J'ai modifié ma migration pour ne pas laisser tomber et recréer l'index, mais juste le renommer. Le résultat est que l'index nommé mapped_teams_team_index existe toujours mais il indexe maintenant correctement la colonne mapped_team. Cela fonctionne à la fois sur Mysql et SQLite.