【问题标题】:Laravel dynamic connections to different databases at the same timeLaravel 同时动态连接不同的数据库
【发布时间】:2019-03-28 08:45:09
【问题描述】:

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

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

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

id  database_name
1   stock_1
2   stock_2
  • master_database 是默认数据库,其凭据位于 .env 文件中)

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

- database_name
- email
- password

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

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

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

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 - 如果输入的emailpassword 正确,我会检查此数据库中的users 表,然后我登录用户。

所以我的问题是:

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

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

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

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我明白了,但问题是当user_1 连接到stock_1 时,所以在这种情况下数据库配置设置为stock_1。但在那之后user_2 会自行连接到应用程序stock_2 数据库。配置会发生什么?即使不是他的数据库,user_1 会自动连接到stock_2 吗?
    • 设置配置时,只会影响当前请求。所以不,它不会影响 user_1。
    • 哦,我没想到它会这样。您能否向我推荐任何可以帮助我了解配置如何工作的资源,特别是对于这种情况,因为文档中没有提到这一点。
    • 可以参考this。每次发出请求时,都会引导并实例化一个新的 laravel 实例。每个请求都是独立的,并且请求所做的每个更改都不会生效,除非有某个地方可以存储它(数据库、缓存)。两个 php 请求无法相互通信(据我了解)。我也使用这种方法来更改配置。
    • 我已经编辑了上面的评论。除此之外,为了测试这个方法,我认为你可以提出两个请求,其中一个是sleep。第一个请求更改配置>睡眠>响应数据库名称,第二个请求直接更改配置而不休眠,看看它们都响应什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2016-07-05
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多