2015-10-07 1 views
2

Je travaille sur une application multi-base de données multi-locataires où j'ai une DB principale qui consiste en une table de locataires, puis pour chaque client hébergé créé, un nouveau DB est créé. J'écris un fichier de départ pour ceci et je le cours 3 fois pour créer 3 locataires et ensuite 3 DB pour eux.Seeder fonctionne bien la première fois, mais ne fait pas certaines tâches dans les boucles suivantes dans Laravel 5?

Il fonctionne bien la première fois. Un nouveau locataire est créé dans DB principal. Un nouveau DB est créé en utilisant le username du nouveau locataire. Le DB est également migrated avec l'appel de commande Artisan du code. Mais dans les 2 boucles suivantes, les locataires sont créés dans le DB principal et de nouveaux DB sont également créés pour eux mais l'appel de commande Artisan ne migre pas les DB.

public function run() 
{ 
    $faker = Faker::create(); 

    // Fetching all tenants 
    $tenants = App\Tenant::all(); 

    // Deleting their databases 
    $tenants->each(function($tenant){ 
     DB::statement('DROP DATABASE IF EXISTS ' . $tenant->username); 
    }); 

    // Truncating the tenants table itself 
    DB::table('tenant')->truncate(); 

    for($i = 0; $i < 3; $i++){ 

     $company = $faker->company(); 
     $description = $faker->text(); 
     $logo = $faker->imageUrl(50, 50); 
     $username = str_random(8); 

     \Config::set('database.default', 'archive'); 

     echo 'Creating tenant ' . $i . "\r\n"; 

     Tenant::create([ 
      'name'   => $company, 
      'description' => $description, 
      'logo'   => $logo, 
      'username'  => $username, 
     ]); 

     DB::statement('CREATE DATABASE ' . $username); 

     \Config::set('database.connections.tenant.database', $username); 
     \Config::set('database.default', 'tenant'); 

     echo 'Migrating tenant ' . $i . "\r\n"; 

     \Artisan::call('migrate', [ 
      '--path' => 'database/migrations/tenants' 
     ]); 

     echo "\r\n"; 
    } 
} 

Qu'est-ce que je fais mal ici. Il fonctionne parfaitement la première fois. Et puis les deux dernières fois seuls les DB sont créés mais ne sont pas migrés. Seul le premier DB est migré avec succès à partir de cela. Et aucune erreur n'est jetée de l'artisan.

La sortie de ligne de commande est la suivante:

Creating tenant 0 

Migrating tenant 0 


Creating tenant 1 

Migrating tenant 1 


Creating tenant 2 

Migrating tenant 2 

Répondre

2

La connexion de base de données est maintenue en vie dans Laravel, ce qui signifie qu'il ne passera pas à la nouvelle base de données lorsque vous modifiez le nom de la base de données via config. Vous devez forcer la connexion de fond à être reconnecté par DB::connection($connection)->reconnect(). Lorsque vous exécutez des migrations, Laravel utilise le nom de la base de données et le nom de la table pour vérifier l'existence de la table migrations. Vous devez également mettre à jour le nom de la table de la connexion en cours.

Dans votre cas:

# ... 
\Config::set('database.connections.tenant.database', $username); 
\Config::set('database.default', 'tenant'); 

\DB::reconnect(); 
\DB::setDatabaseName($username); 
# ... 
+0

'table de base ou vue non trouvée: 1146 Table 'psiqQVD7.migrations' n'exist' pas que je reçois quand je suis en train de la solution. Une idée de ce qui se passe? La première table est encore correctement configurée. La deuxième table ne le fait pas. Cette erreur apparaît sur l'appel de la commande Artisan. – Rohan

+0

J'ai édité ma réponse et l'ai testée avec mon installation MySQL locale. –

+0

D'accord, cela a fonctionné. Sensationnel. Mais je ne comprends toujours pas comment. En tout cas merci. :) – Rohan