Laravel - 多租户 - 一个数据库多个表

时间:2014-08-05 11:44:49

标签: laravel eloquent saas multiple-tables multi-tenant

我想使用 Laravel 创建多租户应用程序。我正在使用一个数据库,多个租户表数据库架构。

我想在有人注册新租户帐户时动态创建一组新的租户相关表格

请考虑以下事项:

design

租户表包含所有客户注册。每个租户只有专门的桌子。在此示例中,每个租户都有自己的专用客户表。

前:

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';


?>

这是实现这一目标的正确方法吗?最简单的做法是什么?你知道任何类型的资源/包/库吗?

提前致谢!

1 个答案:

答案 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()); 
}