我们正在构建一个多租户应用程序。通过管理界面,我们将在需要时添加新租户。此应用程序需要使用 1+n 数据库。
1 个主数据库,大约有 5 个表。n 我们创建的每个租户的数据库。特定于租户的数据库可能完全驻留在单独的数据库服务器上。
问题:
- 实现这一目标的最佳方法是什么?
- 我们在哪里存储每个租户的数据库连接信息?
- 有时,我们可能不得不对租户和主数据库中的表进行连接查询。这将如何工作?
提前感谢您的阅读和任何可能的解决方案。
我们正在构建一个多租户应用程序。通过管理界面,我们将在需要时添加新租户。此应用程序需要使用 1+n 数据库。
1 个主数据库,大约有 5 个表。n 我们创建的每个租户的数据库。特定于租户的数据库可能完全驻留在单独的数据库服务器上。
问题:
提前感谢您的阅读和任何可能的解决方案。
我们可以config/database.php
在连接部分设置数据库连接:
'connections' => [
//Our primary DB
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
//Secondary DB
'mysql2' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB2_DATABASE', 'secondary'),
'username' => env('DB2_USERNAME', 'forge'),
'password' => env('DB2_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
],
对于模型,我们可以添加
class User2 extends Model
{
protected $connection = 'mysql2';
}
在迁移中我们可以使用连接方法。
Schema::connection('mysql2')->create('table')
如果你使用 Eloquent ORM,我们可以使用setConnection('mysql2')
它。
$user = new User2;
$user->setConnection('mysql2');
这个答案基于这个问题
谷歌是你的朋友,文档也是: https ://laravel.com/docs/5.4/database#using-multiple-database-connections
config/database.php
并为您要使用的每个数据库连接添加一个新连接。
要切换连接:
$users = DB::connection('foo')->select(...);
在我的情况下,不会在主数据库中使用多租户存储子数据库配置 中间件中的子数据库参数使用 $connection = 'child' 在所需模型中加入是不可能的,因为可能是不同的服务器,但很大一部分关系是有效的适当地(不是 whereExists,withCount.. 等)
希望有帮助