2017-06-14 154 views
3

我有一個多租戶應用程序,它具有包含客戶端信息的主數據庫,它具有用於不同數據庫的設置。通過在啓動時讀取URL,我可以找出他們正在訪問的租戶,然後切換連接並緩存設置,以便使用正確的租戶數據庫。這部分工作,但問題出現在遷移。Laravel 5.4多租戶遷移,用於遷移的切換連接

常規的Laravel遷移只處理主表,因此我爲「租戶」添加了遷移文件夾,這需要在每個更新的所有租戶上運行。要做到這一點我用下面的類

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

正如你可以看到這是隻由塞定義一個租戶,我有另外一個命令循環,並在所有租戶致電工匠命令。

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

這裏的問題是,雖然檢查蛞蝓的值是正確的找到正確的租戶信息,連接得到儘管切換連接停留在第一個租戶。即使我嘗試將其切換到根目錄並返回,它也會忽略對配置的更改。 有沒有辦法告訴laravel重置連接,以便它將使用配置中的更新值重新連接?從租戶之間與當前連接

+0

嘗試使用DB :: disconnect('tenant');在設置配置之後,在你的migrator-> setConnection()調用之前。 – btl

+1

似乎正在與此工作!謝謝,如果你想寫一個答案,我會接受它,如果不是,我可以把它放在一起。 –

+0

我可以寫一個,很高興它爲你工作! – btl

回答

2

斷開:

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

這將清理資源連接,並迫使應用程序使用正確的配置設置來重新建立本身。