【问题标题】:Laravel 5 Multi-Tenancy with separate databases - apply tenant connection to all DB queries具有单独数据库的 Laravel 5 多租户 - 将租户连接应用于所有数据库查询
【发布时间】:2018-02-12 22:30:44
【问题描述】:

我希望我的 Laravel Web 应用程序是多租户的,具有一个用于身份验证的通用数据库和一个用于我的客户的特定数据库。

感谢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);
}

但对查询没有影响。

希望有人能解释一下..

【问题讨论】:

    标签: laravel multi-tenant


    【解决方案1】:

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

    【讨论】:

    • 这是一个解决方案,但我想在全球范围内设置它
    • 然后你可以在你的.env文件里面设置这一行:DB_CONNECTION=tenant_mysql
    • 这有一个小缺点,它会影响用于身份验证的连接
    • 那么你应该如何全局设置它呢?最好的方法是在您的Authentication 正在处理另一个db 的情况下使用DB::connection
    • 我终于在我的查询中使用了DB::connection('tenant_mysql')->...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2017-08-01
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多