目前我有一个应用程序,它托管用CodeIgniter编写的多个租户。但我真的很喜欢Laravel 4,我想开始将应用程序迁移到Laravel。
以下是当前设置:
- 每个租户都有自己的数据库。
- 只有一组应用程序文件。
- 当我们创建新租户时,将创建一个新数据库并运行安装脚本,并在数据库中设定一些初始信息的种子。
- 每个租户也有自己的子域。这就是我们如何检测要使用的数据库。
- 有一个主数据库,用于保存租户信息和用户以及其他一些常规表。
- 当需要架构更新时,我们只需创建一个将为每个租户运行的更新脚本。这是通过代码点火器的特殊编码的 CLI 脚本发生的
在 Codeigniter 中,启动和结束新的数据库连接相对容易。
对于Laravel,我有以下问题/疑问。
- 您将如何动态启动/结束数据库连接? 我想
- 使用迁移,但我想为每个租户运行它们。迁移目前仅在"主"数据库连接上运行。而且它只运行一次。
- 播种也是如此。
这些是我的主要问题,我还有其他一些小问题,但这些都可以解决。
希望有人能有所了解。
我只是在试一试,所以要注意:)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::d atabaseConnection(),并在扩展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
可以使用租户数据库凭据创建 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);
这将需要在数据库.php文件中创建 2 个连接。(例如应用和租户)并在模型中指定要使用的数据库(1 用于存储租户,1 用于租户特定数据库)
并且可能创建一个路由/脚本来创建/更新表。不确定使用多个数据库进行迁移。
您可以使用以下语法在 laravel 中创建动态数据库连接
Config::set('database.connections.key', array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'dbname',
'username' => 'dbuser',
'password' => 'dbpass',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
));
有了这个DB::connection('key'); would just work.
我最近遇到了类似的问题,不得不为多个模型使用不同的数据库。
我找到了以下方法。
- 在应用程序/配置/数据库中.php添加新的连接MY_NEW_CONNECTION
- 对于新连接,将数据库名称设置为任何 值
在筛选器.php或路由.php或控制器的__construct方法中添加以下内容:
$db ="获取数据库名称";Config::set('database.connections.MY_NEW_CONNECTION.database',$db);DB::setDefaultConnection('MY_NEW_CONNECTION');
1)您可以在数据库中定义多个命名连接.php配置文件
'connections' => array(
'tenant1' => array(
...
),
'tenant2' => array(
...
),
然后,您可以选择将哪一个用于此类内容。
$something = DB::connection('tenant1')->select(...);
2)这不是一个完整的解决方案,因为我认为它需要对核心进行一些黑客攻击,但是您可以选择在哪个连接上运行迁移。也许您可以循环访问租户列表并在所有租户上运行它。
Schema::connection('tenant1')->create('users', function($table)
3)不幸的是,我认为种子还不支持多个连接。您可能需要推出自己的种子设定功能。