2017-03-01 102 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';