Laravel - 在多租户应用程序上设置动态数据库连接

时间:2017-03-01 14:21:37

标签: database laravel dynamic multi-tenant laravel-5.4

在我的应用程序中,我有不同的业务,并且有许多用户。 例如:

  • 商家A拥有UserA,UserB和UserC
  • 商家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. 获取用户数据库标识符/数据库名称
  4. 在名为“tenant”
  5. 的连接中设置该特定数据库名称
  6. App使用该租户连接来加载该特定的数据 用户/业务
  7. 如何在Laravel 5.4中实现这一目标?

1 个答案:

答案 0 :(得分: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';