首页 > 解决方案 > Laravel 同时动态连接不同的数据库

问题描述

我正在构建一个 Laravel 库存管理应用程序,它允许每个订阅者(用户)stock在单独的数据库中拥有一个。

所有用户的数据库都具有源自相同 Laravel 迁移的相同设计。

我有一个master_database,其中包含一个stock表格,如下所示:

id  database_name
1   stock_1
2   stock_2

用户将能够通过提交包含 3 个字段的表单来登录应用程序:

- database_name
- email
- password

例如,当用户想要连接到stock_1数据库时,我会执行以下操作:

1 - 我检查stock_1数据库是否存在于stock表中(在 中master_database)。

2 - 我stock_1通过提供database_name此方法动态更改数据库配置来连接到数据库:

public static function connect($db)
{
    // get default connection
    $connections = \Config::get('database.connections');
    $newConnection = $connections[\Config::get('database.default')];
    $newConnection['database'] = $db;
    $newConnection['username'] = 'root';
    $newConnection['password'] = 'root';

    \Config::set('database.connections.' . $newConnection['database'], $newConnection);
    \Config::set('database.default', $newConnection['database']);
}

3 -如果输入的&正确,我会检查users此数据库中的表,然后登录用户。emailpassword

所以我的问题是:

标签: phpmysqllaravel

解决方案


这种动态数据库配置会影响整个项目吗?

是的,只要你在connect每次请求进入时都调用了你定义的这个方法。

如果有许多用户试图同时连接到不同的数据库怎么办?这会起作用还是他们都会共享对配置的最后一次修改?

每次用户提出请求时,初始配置将是来自 .env 的配置,直到您调用您的connect方法。所以,是的,即使有很多用户连接到您的服务器(只要他们在不同的请求中),它也不会中断。

有没有更好的方法来做到这一点,同时将每只股票保存在单独的数据库中?

我认为您可以将连接方法放在中间件中,以便在经过身份验证的用户发出请求时连接到所需的数据库。


推荐阅读