具有单独数据库的Laravel 5 Multi-Tenancy - 将租户连接应用于所有数据库查询

时间:2018-02-12 22:30:45

标签: laravel multi-tenant

我希望我的Laravel网络应用程序成为多租户,其中包含一个用于身份验证的通用数据库和我的客户的特定数据库。

感谢一些good readings,我想出了如何使用适当的中间件来实现这一目标。

config\database下,我添加了我的租户连接:

'tenant_mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => '',
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        ...]

然后制作了一个专用的MultiTenant中间件:

...

    public function handle($request, Closure $next)
    {
        $tenant_db = Auth::user()->tenant_db;
        Config::set('database.connections.tenant_mysql.database', $tenant_db);

        return $next($request);
    }

要完成,请通过添加:

tenant_mysql连接应用于所需的Model
protected $connection = 'tenant_mysql';

它很棒!

我的问题始于正确配置我的应用中的DB::rawDB::table,... queries

我认为上面创建的是建立连接的好地方所以我更新了它:

public function handle($request, Closure $next)
{
    $tenant_db = Auth::user()->tenant_db;

    DB::purge('tenant_mysql');                       //line added
    Config::set('database.connections.tenant_mysql.database', $tenant_db);

    DB::reconnect('tenant_mysql');                   //line added

    return $next($request);
}

但对查询没有影响。

希望有人能说清楚......

1 个答案:

答案 0 :(得分:1)

您的连接已经设置,您只需使用DB::connection('tenant_mysql')->select(...);,或者如果您想全局设置它,您可以更改environment (.env)文件并将名为DB_CONNECTION的变量更改为{{1喜欢:tenant_mysql