我只是对此进行尝试,因此请注意:) 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);
});
就个人而言,我会为每个用户添加一个新方法 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