我想使用 Laravel 创建多租户应用程序。我正在使用一个数据库,多个租户表数据库架构。
我想在有人注册新租户帐户时动态创建一组新的租户相关表格。
请考虑以下事项:
租户表包含所有客户注册。每个租户只有专门的桌子。在此示例中,每个租户都有自己的专用客户表。
前:
tenant01 的表格将包含 tenant01 前缀。 (tenant01.customer - 只有tenant01的客户)
tenant02 的表格将包含 tenant02 前缀。 (tenant02.customer - 只有tenant02的客户)
我不想使用多个数据库,因为它们很昂贵,而且我不想为所有租户使用一个表,因为系统中会有很多客户/产品等。
我计划在日志记录过程中识别租户,并在会话中设置租户名称(或代码/ ID)。例如:tenant440
之后,在所有与客户相关的雄辩模型类中,我可以动态地将该前缀(例如:tenant440)附加到表名中,如下所示:
<?php
class Customer extends Eloquent {
protected $tenant_name = //get name/code from the session. ex: tenant440
//table name will become tenant440.'customers'
protected $table = $tenant_name.'customers';
?>
这是实现这一目标的正确方法吗?最简单的做法是什么?你知道任何类型的资源/包/库吗?
提前致谢!
答案 0 :(得分:2)
您可以将租户名称设置为数据库文件中的前缀:
Config::set('database.connections.mysql.prefix',$tenantName); // assuming 'mysql' is the default database connection name
我建议把它放在过滤器里
// routes.php
Route::group(array('before'=>'setTablePrefix'), function($noob)
{
Route::resource('customers', 'CustomersController');
Route::controller('sales', 'SalesController');
});
Route::get('/login',array('as' => 'login', 'uses' => 'UserController@getLogin'));
// filters.php
Route::filter('setTablePrefix', function($route, $request)
{
if (!Session::has('prefixTable'))
App::abort(404);
Config::set('database.connections.mysql.prefix',Session::get('prefixTable'));
});
要从所有表中获取数据,您可能需要两个查询(如果使用Session,则需要一个查询)
$tenants = DB::table('tenants')->lists('name'); // you can set it in Session
if($tenants){
$allCustomers = DB::table($tenants[0].'.customers');
for ($i = 1; $i < count($tenants); $i++) {
$allCustomers->unionall(DB::table($tenants[$i].'.customers'));
}
var_dump($allCustomers->get());
}