2015-10-18 75 views
5

我正在創建一個多租戶應用程序,其中基於子域,我連接到該特定租戶的數據庫。在Laravel中連接多個數據庫的最佳方式

這裏是代碼來做到這一點:

// To connect with a subdomain - the entry will be in config/database.php. 
    public static function connectSubdomainDatabase($dbname) 
    { 
     $res = DB::select("show databases like '{$dbname}'"); 
     if (count($res) == 0) { 
      App::abort(404); 
     } 
     Config::set('database.connections.subdomain.database', $dbname); 

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

是否與數據庫連接的最佳方法還是有,因爲我正在從性能上看思考,因爲每次我連接任何問題與數據庫時有不同的子域名。什麼是最好的方式來做到這一點?

+0

如果你可以使用共享數據庫多租戶模式的一些工作已經爲laravel完成。 https://github.com/AuraEQ/laravel-multi-tenant – user993553

+0

@ user993553是的,我檢查過之前,但正如我在我的標記中提到的,我希望它爲Laravel-5.1和包是4.2+ –

+0

找到另一個https: //github.com/orchestral/tenanti與5 – user993553

回答

1

這幾乎是做到這一點的最佳方式。無論如何,最後都是意見。但是,我會在每個子域的配置文件中創建一個連接。然後,在您的connectSubdomainDatabase()函數中,我將獲取當前子域而不是傳遞數據庫名稱。你可以在laravel中指定一個連接,你應該使用數據庫名稱的唯一地方是在配置文件中。

所以,這樣的事情:

// To connect with a subdomain - the entry will be in config/database.php. 
public static function connectSubdomainDatabase() 
{ 
    // Break apart host 
    $urlParts = explode('.', $_SERVER['HTTP_HOST']); 

    // Change default connection 
    Config::set('database.default', $urlParts[0]); 
} 

其中,config/database.php中的連接是:

'connections' => [ 

     'subdomain1' => [ 
      'driver' => 'mysql', 
      'host'  => env('DB_HOST', 'localhost'), 
      'database' => env('DB_DATABASE', 'forge'), 
      'username' => env('DB_USERNAME', 'forge'), 
      'password' => env('DB_PASSWORD', ''), 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
      'strict' => false, 
     ], 

     'subdomain2' => [ 
       'driver' => 'mysql', 
       'host'  => env('DB_HOST', 'localhost'), 
       'database' => env('DB_DATABASE', 'forge'), 
       'username' => env('DB_USERNAME', 'forge'), 
       'password' => env('DB_PASSWORD', ''), 
       'charset' => 'utf8', 
       'collation' => 'utf8_unicode_ci', 
       'prefix' => '', 
       'strict' => false, 
     ], 

    ], 
+0

謝謝你的回覆,我做了同樣的@mikel。我忘了在這裏回答。希望它能幫助其他人。 –