2017-06-14 2 views
3

J'ai une application multi-locataire qui a une base de données master avec des informations client, cela a des paramètres pour différentes bases de données. En lisant l'URL au démarrage, je peux déterminer le locataire auquel ils accèdent, puis changer la connexion et mettre en cache les paramètres afin d'utiliser la bonne base de données des locataires. Cette partie fonctionne mais le problème vient des migrations. Les migrations Laravel habituelles ne gèrent que la table principale, j'ai donc ajouté un dossier de migration pour les "locataires" qui doit être exécuté sur tous les locataires pour chaque mise à jour. Pour ce faire, j'utilise la classe suivanteLaravel 5.4 Migrations multi-locataires, changement de connexion pour les migrations

<?php 

namespace App\Console\Commands\Tenants; 

use Illuminate\Console\Command; 
use Illuminate\Support\Facades\DB; 

class UpdateTenant extends Command 
{ 
    protected $signature = 'tenant:update {slug}'; 
    protected $description = 'Update a tenants database'; 
    protected $migrator; 

    public function __construct() 
    { 
     parent::__construct(); 

     $this->migrator = app()->make('migrator'); 
    } 

    public function fire() 
    { 
     $arguments = $this->arguments(); 

     if ($account = DB::connection('root')->table('accounts')->where('slug', '=', $arguments['slug'])->first()) { 
      config()->set('database.connections.tenant.database', $arguments['slug']); 
      $this->migrator->setConnection('tenant'); 
      if (! $this->migrator->repositoryExists()) { 
       $this->call('migrate:install', ['--database' => 'tenant']); 
      } 
      $this->migrator->run([$this->laravel->basePath() . '/' . 'database/tenants']); 
      foreach ($this->migrator->getNotes() as $note) { 
       $this->output->writeln($note); 
      } 
     } 
    } 
} 

Comme vous pouvez le voir c'est juste pour un locataire défini par la limace, j'ai une autre commande à boucle et appeler la commande artisan sur tous les locataires.

foreach ($accounts as $account) { 
    $this->call('tenant:update', ['slug' => $account->slug]); 
} 

Le problème ici est que bien vérifier la valeur de la limace, il est de trouver correctement les informations de locataire correct, la connexion se coince sur le premier locataire, malgré la commutation de la connexion. Même si j'essaie de passer à la racine et vice-versa, il ignore simplement la modification de la configuration. Y at-il de toute façon dire à laravel de réinitialiser la connexion afin qu'elle utilise les valeurs mises à jour dans la configuration pour se reconnecter?

+0

Essayez d'utiliser DB :: disconnect ('tenant'); après avoir défini la configuration et avant votre appel migrator-> setConnection(). – btl

+1

Ça semble fonctionner avec ça! merci, si vous voulez écrire une réponse, je vais l'accepter, sinon je peux en mettre un ensemble. –

+0

Je peux en écrire un, heureux que cela a fonctionné pour vous! – btl

Répondre

2

Se déconnecter de la connexion actuelle entre les locataires:

config()->set('database.connections.tenant.database', $arguments['slug']); 
DB::disconnect('tenant');<----- add this 
$this->migrator->setConnection('tenant'); 

Cela va nettoyer la connexion des ressources et forcer l'application à se rétablir avec les paramètres de configuration.