2015-10-18 66 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。我忘了在这里回答。希望它能帮助其他人。 –

相关问题