Laravel 4:多租户应用程序,每个租户拥有自己的数据库和一个全局数据库

Vic*_*rez 26 php laravel laravel-4

目前我有一个应用程序,托管用CodeIgniter编写的多个租户.但我真的很喜欢Laravel 4,我想开始将应用程序迁移到Laravel.

这是当前的设置:

  • 每个租户都有自己的数据库.
  • 只有一组应用程序文件.
  • 当我们创建新租户时,将创建一个新数据库并运行安装脚本,并为数据库添加一些初始信息.
  • 每个租户也有自己的子域名.这就是我们如何检测使用哪个数据库.
  • 有一个主数据库,用于保存租户信息和用户以及一些其他常规表.
  • 当需要模式更新时,我们只需创建一个将为每个租户运行的更新脚本.这通过Codeigniter的特殊编码CLI脚本实现

在Codeigniter中,启动和结束新的数据库连接相对容易.

在Laravel我有以下问题/问题.

  • 如何动态启动/结束数据库连接?
  • 我想使用迁移,但我想为每个租户运行它们.迁移当前仅在"主"数据库连接上运行.它只运行一次.
  • 播种也一样..

这些是我的主要问题,我有一些其他的小东西,但这些可以解决.

希望有人可以解释一下......

Ble*_*ing 23

我只是对此进行了尝试,因此请注意:) DatabaseManager类,无论何时调用DB,都使用和扩展方法.这是链接.DB :: connection()方法应返回Illuminate\Database\Connection的实例.从这一切,我将创建一个新的用户连接,如下所示:

$user = Auth::user();
DB::extend($user->username, function() use ($user) {
   // $pdo = new PDO(); set this up how you see fit
    return new Illuminate\Database\Connection($pdo, $user->databaseName, $tablePrefix);
});
Run Code Online (Sandbox Code Playgroud)

就个人而言,我会为每个用户添加一个新方法,User :: databaseConnection(),并在我扩展DatabaseManager时调用它.

DB::extend($user->username, function() use ($user) {
    return $user->databaseConnection();
});
Run Code Online (Sandbox Code Playgroud)

通过您的应用程序,您应该能够通过以下方式呼叫注册用户的连接:

DB::connection(Auth::user()->username);
Run Code Online (Sandbox Code Playgroud)

更新

根据您调用租户连接的频率和时间,您可能希望使用IOC容器.

App::bind('tenantDB', function()
{
     return DB::connection(Auth::user()->username);
});

App::make('tenantDB')->insert(...);
Run Code Online (Sandbox Code Playgroud)

我忘记了迁移和播种.对于迁移,您可以设置文件路径

php artisan migrate:make foo --path=app/migrations
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用Config类设置默认数据库或DB :: setDefaultConnection($ username),我将假设将为当前连接完成所有迁移和种子设定.当该过程完成后,您可以切换回主数据库.

更新2

laravel的开发人员很惊人,我应该肯定有这样的冲动,要早点检查出来.您可以在已创建的任何数据库连接上进行迁移和种子设定.

artisan migrate --database='userConnectionName' 
artisan db:seed --database='userConnectionName'
Run Code Online (Sandbox Code Playgroud)

看看Barry的答案,这可能比扩展DatabaseManager更简单.

如果要查看这些命令的所有选项,只需运行:

artisan help migrate
artisan help db:seed
Run Code Online (Sandbox Code Playgroud)


Bar*_*vdh 6

您可以使用租户数据库凭据创建1个数据库,并在您的应用中动态设置它们:

$tenant = Tenant::where('username', '=', $username)->first();
Config::set('database.connections.tenant.username', $tenant->db_username);
Config::set('database.connections.tenant.password', $tenant->db_password);
Config::set('database.connections.tenant.database', $tenant->db_database);
Run Code Online (Sandbox Code Playgroud)

这将需要在database.php文件中创建2个连接.(例如app和tenant)并在模型中指定要使用的数据库(1用于存储租户,1用于租户特定数据库)

并且可能创建一个路径/脚本来创建/更新表.不确定有多个数据库的迁移.

  • 您可以这样做: DB::connection('tenant') 或在您的模型中指定连接: public static $connection = 'tentant'; (2认同)