我只是试图猜测一下,所以请注意 :)
每当调用 DB 时使用的 DatabaseManager 类都有一个 extend 方法。这里是源代码链接。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);
});
就我个人而言,我会为每个用户添加一个新方法 User::databaseConnection(),并在扩展DatabaseManager时调用它。
DB::extend($user->username, function() use ($user) {
return $user->databaseConnection();
});
在您的应用程序中,您应该能够通过以下方式调用已注册用户的连接:
DB::connection(Auth::user()->username)
更新
根据您调用租户连接的频率和时间,您可能需要使用IOC容器。
App::bind('tenantDB', function()
{
return DB::connection(Auth::user()->username);
});
App::make('tenantDB')->insert(...);
我忘记了迁移和填充数据。对于迁移,您可以设置文件路径。
php artisan migrate:make foo --path=app/migrations
如果您使用Config类来设置默认数据库或DB::setDefaultConnection($username),我会假设所有迁移和填充都将为当前连接完成。当该过程完成后,您可以切换回主数据库。
更新2
Laravel开发人员非常出色,我应该早点检查这个功能。您可以在任何已创建的数据库连接上执行迁移和填充。
artisan migrate --database='userConnectionName'
artisan db:seed --database='userConnectionName'
看看Barry的回答,那可能比扩展DatabaseManager要简单得多。
如果您想查看这些命令的所有选项,请运行:
artisan help migrate
artisan help db:seed
php artisan migrate --database='userConnectionName'
应该可以工作。对于种子数据填充,您可能仍然需要更改默认连接。我建议您有几个选择:(1)编写一个自定义命令来执行种子数据填充,或者(2)提出一个关于种子数据填充命令的 --database 选项的功能请求。 - Blessingartisan db:seed --database='userConnectionName'
。这些 Laravel 开发者真是太牛了! - Blessingartisan migrate --seed --database=tenant
。创建一个“tenant”连接,然后通过Config::set()更改选项似乎是实现您想要的最干净的方法。为了确保artisan正在使用特定的租户数据库,请添加代码以设置/验证连接选项到start/artisan.php文件中。 - Blessing