2017-03-01 80 views
0

在我的應用程序中,我擁有不同的業務,而且有很多用戶。 例如:Laravel - 在多租戶應用程序上設置動態數據庫連接

  • 業務有用戶A,用戶B和用戶C
  • 商務B有UserD和UserE

等等..

每個企業都有自己獨立的數據庫,所以用戶A,B和C訪問同一個數據庫,並且用戶D和E訪問不同的數據庫(每個租戶數據庫在結構上是相同的,唯一不同的是數據)。

有一個主數據庫爲每個用戶提供這些信息,所以我知道一個用戶屬於哪個數據庫。

'main' => array(
    'driver' => 'mysql', 
    'host'  => 'hostname', 
    'database' => 'main_database', 
    'username' => 'username', 
    'password' => 'password', 
    'prefix' => '', 
), 

'tenant' => array(
    'driver' => 'mysql', 
    'host'  => 'localhost', 
    'database' => DYNAMIC_DATABASE_NAME_GOES_HERE, 
    'username' => 'username', 
    'password' => 'password', 
    'prefix' => '', 
), 

我需要找到一種方法,做Laravel如下:該應用程式

  1. 用戶跡象
  2. 登錄後,我得到了用戶數據庫標識符/數據庫名稱中使用主數據庫連接
  3. 在名爲「tenant」的連接中設置該特定數據庫名稱
  4. 應用程序使用該租戶連接加載該特定的數據 user/busi ness

我該如何在Laravel 5.4中完成這項工作?

回答

1

link有一個很好的例子,你正在尋找什麼。

1)在數據庫配置中設置兩個連接。

'main' => array(
    'driver' => 'mysql', 
    'host'  => 'hostname', 
    'database' => 'database', 
    'username' => 'username', 
    'password' => 'password', 
    'prefix' => '', 
), 

'tenant' => array(
    'driver' => 'mysql', 
    'host'  => '', 
    'database' => '', 
    'username' => '', 
    'password' => '', 
    'prefix' => '', 
) 

2)然後切換數據庫,將以下代碼放入您的過濾器或中間件中。考慮到你有數據庫連接信息的Tenant模型。

$tenant = Tenant::whereSubDomain($subdomain)->first(); 

Config::set('database.connections.tenant.host', $tenant ->host); 
Config::set('database.connections.tenant.username', $tenant ->username); 
Config::set('database.connections.tenant.password', $tenant ->password); 
Config::set('database.connections.tenant.database', $tenant ->database); 

//If you want to use query builder without having to specify the connection 
Config::set('database.default', 'tenant'); 
\DB::purge('tenant'); 
\DB::reconnect('tenant'); 

dd(\DB::connection('tenant')); 

3)指定你的模型如下

//On models dealing with the main DB 
protected $connection = 'main'; 

//On models dealing with tenant DBs 
protected $connection = 'tenant'; 
相關問題