2017-06-14 2 views
3

Ich habe eine Multi-Tenant-App mit einer Master-Datenbank mit Client-Informationen, die Einstellungen für verschiedene Datenbanken enthält. Durch das Lesen der URL beim Start kann ich herausfinden, auf welchen Mandanten sie zugreift, dann die Verbindung wechseln und die Einstellungen zwischenspeichern, so dass sie die richtige Mandanten-Datenbank verwendet. Dieser Teil funktioniert, aber das Problem kommt mit Migrationen.Laravel 5.4 Multi-Tenant-Migrationen, Switching-Verbindungen für Migrationen

Die regulären Laravel-Migrationen behandeln nur die Master-Tabelle. Daher habe ich einen Migrationsordner für "Mandanten" hinzugefügt, der für alle Mandanten für jedes Update ausgeführt werden muss. Dazu verwende ich die folgende Klasse

<?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); 
      } 
     } 
    } 
} 

Wie Sie sehen dies nur für einen Mieter von der Schnecke definiert ist, ich habe einen anderen Befehl Schleife und rufen Sie den Handwerker-Befehl auf allen Mietern.

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

Das hier Problem ist, dass der Wert des Rohlings, obwohl die Überprüfung es richtig Informationen der richtigen Mieter zu finden, wird die Verbindung trotz der Verbindung Einschalten des ersten Mieter stecken. Selbst wenn ich versuche, es in den root und zurück zu schalten, ignoriert es einfach die Änderung der Konfiguration. Gibt es überhaupt zu sagen, dass laravel die Verbindung zurücksetzt, so dass es die aktualisierten Werte in der Konfiguration verwendet, um die Verbindung wiederherzustellen?

+0

Versuchen Sie es mit DB :: disconnect ('mandant'); nachdem Sie die Konfiguration und vor Ihrem migrator-> setConnection() - Aufruf festgelegt haben. – btl

+1

Scheint damit zu arbeiten! danke, wenn du eine antwort schreiben willst, werde ich es annehmen, wenn nicht, kann ich eins zusammensetzen. –

+0

Ich kann eine schreiben, froh, dass es für Sie gearbeitet hat! – btl

Antwort

2

Trennen vom Stromverbindung zwischen Mietern:

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

Dies wird die Ressource-Verbindung und zwingen die App aufzuräumen selbst Einstellungen mit den korrekten Konfiguration wiederherzustellen.