Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Laravel-选择登录时使用的数据库_Mysql_Authentication_Laravel_Multi Tenant - Fatal编程技术网

Mysql Laravel-选择登录时使用的数据库

Mysql Laravel-选择登录时使用的数据库,mysql,authentication,laravel,multi-tenant,Mysql,Authentication,Laravel,Multi Tenant,我刚刚开始学习Laravel,我设法使用Auth类进行简单的登录 现在,我的申请需要以下内容: 我有一个名为“global”的全局数据库,它有一些表,包括“sysadmins”和“tenants”。我还为每个租户建立了一个数据库,称为“租户{id}”,其中{id}是租户的id。 此外,在每个“租户{id}”数据库中都有一个“用户”表 因此,当用户登录时,他应该给出他的电子邮件(或用户名)、密码和他所属租户的id(有些人可能建议我通过子域进行标识,但目前这不是问题)。 因此,用户将输入[john]

我刚刚开始学习Laravel,我设法使用Auth类进行简单的登录

现在,我的申请需要以下内容:

我有一个名为“global”的全局数据库,它有一些表,包括“sysadmins”和“tenants”。我还为每个租户建立了一个数据库,称为“租户{id}”,其中{id}是租户的id。 此外,在每个“租户{id}”数据库中都有一个“用户”表

因此,当用户登录时,他应该给出他的电子邮件(或用户名)、密码和他所属租户的id(有些人可能建议我通过子域进行标识,但目前这不是问题)。 因此,用户将输入[john]、[*****]、[5]

现在,他应该根据“tenant_5.”“users”表进行身份验证,并且应该全局定义他的会话的数据库是“tenant_5”数据库。 所以,当他看到像Car::all()这样的模型时;,你猜,使用的数据库是“租户5”


我花了一整天的时间搜索解决方案并进行试验,但我对框架的了解还不够,无法对其进行太多调整。

这是您在运行时设置配置的方式:

Config::set('database.connections.mysql.database', 'tenant_5');
然后,您可以将数据库名称放入会话中:

Session::put('db_used', 'tenant_5');
然后在start/global.php文件中进行检查:

if(Session::has('db_used'))
{
    Config::set('database.connections.mysql.database', Session::get('db_used'));
}

未经测试,但您应该可以这样做。

我自己解决了这个问题:

首先,我们创建到子域的路由组,不包括具有以下模式的“www”:

Route::pattern('id', '[0-9]+');

Route::group(array('domain' => '{subdomain}.mysite.com', 'before' => 'switchDB'), function() {
    // Publicly accessible routes under the subdomain
    Route::group(array('before' => 'guest'), function() {
        // login routes (get and post)
    });

    // Routes under the subdomain that require authentication
    Route::group(array('before' => 'auth'), function() {
    });
});

// Publicly accessible routes in the main domain
Route::get('/', array('uses' => 'PublicController@showHome'));
然后是过滤器,我们从中获取子域并在默认数据库(全局数据库)中检查哪个帐户拥有该域。我们还检查该数据库是否存在

Route::filter('switchDB', function($route, $request) {
    $parts = explode('.', $request->getHost());
    $subdomain = $parts[0];

    $account = Account::where('subdomain', '=', $subdomain)->first();
    if($account == null) {
        App::abort(404);
    }

    $res = DB::select("SHOW DATABASES LIKE '" . $account->db_name . "'");
    if(count($res) == 0) {
        App::abort(404);
    }

    Config::set('database.connections.mysql.database', $account->db_name);
    DB::reconnect();
    Session::put('subdomain', $subdomain);
});

DB::reconnect()似乎是所有这一切的关键因素。

我已经看过Config::set(“…”);在其他帖子中,但它不是适用于所有用户吗?好的,我终于测试了它,它看起来像我想要的一样工作,尽管我真的不明白第三段代码的作用。很抱歉,直到现在才看到你的评论。第一个块是如何在运行时设置数据库,但应该像在第三个块中一样使用。在第三个块中,我们检查是否在用户会话中设置了使用的db_,以及是否设置了数据库配置。你明白吗?(:啊,是的,我现在明白了!非常感谢!我注意到第一次尝试失败,第二次成功。因为它将“db_used”放在会话中,只有global.php中的Config::set可以工作。