2017-10-07 6 views
2

J'ai une commande de console personnalisée qui doit faire défiler certaines entreprises et créer une base de données pour chacune. La commande fonctionne maintenant, mais seulement une fois. Il n'exécute pas la migration une deuxième fois dans la boucle. Donc, fondamentalement, si j'ai 2 DB vides (db_on e et db_two) la config s'exécute et migre la première fois pour db_one et lorsque la boucle s'exécute à nouveau, rien ne se passe à db_two. Si je remplace la commande de la console par l'écho du nom de la base de données, elle renvoie les deux, donc je sais que ce n'est pas la boucle. Aussi, si je déconnecte le DB utilisé dans chaque connexion de la boucle, c'est le bon DB.Artisan Call in Loop

Voici la commande:

public function handle() 
{ 
    $companies = Company::all(); 

    foreach($companies as $company) 
    { 
     \Config::set('database.connections.company.database', $company->db_name); 

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

     $this->info( config('database.connections.company.database')); 

    } 
} 

erreur du journal:

local.ERROR: Database [10_barrel] not configured. {"userId":1,"email":"[email protected]","exception":"[object] (InvalidArgumentException(code: 0): Database [db_2] not configured. at /Users/Sites/cheers/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:140) 

database.php

'connections' => [ 

     'main' => [ 
      'driver' => 'mysql', 
      'host' => env('MAIN_DB_HOST', '127.0.0.1'), 
      'port' => env('MAIN_DB_PORT', '3306'), 
      'database' => env('MAIN_DB_DATABASE', 'forge'), 
      'username' => env('MAIN_DB_USERNAME', 'forge'), 
      'password' => env('MAIN_DB_PASSWORD', ''), 
      'unix_socket' => env('MAIN_DB_SOCKET', ''), 
      'charset' => 'utf8mb4', 
      'collation' => 'utf8mb4_unicode_ci', 
      'prefix' => '', 
      'strict' => true, 
      'engine' => null, 
     ], 

     'company' => [ 
      'driver' => 'mysql', 
      'host' => env('COMPANY_DB_HOST', '127.0.0.1'), 
      'port' => env('COMPANY_DB_PORT', '3306'), 
      'database' => '', 
      'username' => env('COMPANY_DB_USERNAME'), 
      'password' => env('COMPANY_DB_PASSWORD'), 
      'unix_socket' => env('COMPANY_DB_SOCKET', ''), 
      'charset' => 'utf8mb4', 
      'collation' => 'utf8mb4_unicode_ci', 
      'prefix' => '', 
      'strict' => true, 
      'engine' => null, 
     ], 
] 

env:

COMPANY_DB_HOST=127.0.0.1 
COMPANY_DB_PORT=3306 
COMPANY_DB_USERNAME=root 
COMPANY_DB_PASSWORD= 
+0

Quelle est la dose que le fichier journal vous indique? – Webdesigner

+0

@Webdesigner J'ai ajouté l'erreur supérieure que j'ai vu dans le journal (pas toute la trace de la pile) – Packy

+0

Et cette erreur est un résultat direct de votre commande? Quelle version de Larael avez-vous? – Webdesigner

Répondre

0

C'était assez intéressant. Je dois dire que je n'ai pas été en mesure de reproduire entièrement votre erreur (je n'ai pas eu d'erreur dans le journal) mais je suis sûr que la migration est exécutée uniquement pour l'itération de la 1ère boucle.

Première chose au lieu de:

Artisan::call 

Je vous recommande d'utiliser:

$this->call 

vous obtiendrez la sortie supplémentaire ce qui se passe vraiment.

Mais le plus important pour le faire fonctionner est de se déconnecter de la base de données et de purger la connexion. Sinon, Laravel ne verra pas que vous avez modifié le nom de votre base de données dans la configuration et utilisera l'ancienne base de données.

Vous devez ajouter:

$this->laravel['db']->purge('company'); 

à la fin de la boucle pour permettre d'exécuter les migrations comme celle-ci.

Je l'ai testé et cela fonctionne pour moi sans aucun problème.

+0

Parfait. J'avais le sentiment que je devais purger la connexion. Bon travail. – Packy

0

Je suppose que vous avez un problème avec votre logique. Vous définissez un nom de DB à votre configuration, mais dosez cette DB? Et le reste? Mot de passe de l'utilisateur? Sont-ils toujours les mêmes?

La boucle n'est pas le problème, c'est ça! $companies = Company::all(); obtiendra obtenir la date de la base de données par défaut, et vous pouvez en boucle.

Je suppose que le premier DB de votre liste existe déjà (par défaut), mais que le second ne l'est pas et que migrate ne crée pas de base de données, il ne le remplit que si la laravel peut se connecter à DB.