LARAVEL - 每个用户有多个数据库,用户每次都会选择数据库连接

时间:2017-06-04 21:04:59

标签: php database laravel

如果我缺乏必要的知识,那么Laravel相当新,所以请事先接受我的道歉。

所以,我正在构建一个应用程序,每个用户都可以登录到个人仪表板。此仪表板显示来自特定数据库的数据。每个用户都有多个数据库,但每个数据库只属于一个用户。用户可以从仪表板创建新数据库(这由后端处理,只提及它以便更好地了解应用程序的工作原理)。最后,还有一个单独的数据库,对于存储用户 - 数据库关系的所有用户都是通用的。

我需要的每个用户都是:

当他们登录时,他们的仪表板显示属于该用户的最新创建的数据库的数据。 然后,用户可以选择他们想要的数据库"查看"从下拉菜单和仪表板内容相应更改。 现在,我对每个用户使用一个数据库(硬编码),但想要添加上述动态元素。

我在这里发现了类似的东西:

https://laracasts.com/discuss/channels/general-discussion/change-database-name-of-connection-on-the-fly?page=1

但似乎线程中缺少一些答案,因此无法完全遵循它。

每个数据库都具有完全相同的结构,因此只需要一个控制器和模型来动态获取数据库名称的值。

所以我需要的工作流程如下:

  • 用户登录
  • 查看编辑器获取该用户的所有可用数据库的列表,并生成下拉菜单
  • 模型连接到最新创建的数据库
  • Controller使用该连接检索并将数据传递给视图
  • 用户从下拉菜单中选择其他数据库
  • 模型连接已更新为新选定的数据库
  • Controller使用该连接从该数据库获取数据以传递给视图

我的主要问题是定义将当前数据库名称分配给变量的过程,然后模型使用此变量来设置动态连接,最后调用控制器来检索和显示数据。

这样的流程是否可行,最佳方法是什么?

提前感谢您的帮助!!

1 个答案:

答案 0 :(得分:1)

我看到你在这里想做什么,我花了几分钟思考和研究。

看看:https://laracasts.com/discuss/channels/tips/set-up-dynamic-database-connection-globally

这实质上说明你需要在Laravel database.php文件中有两个MySQL连接配置细节。您的主数据库main和次连接(在下面的示例中称为tenant),这是空白的,用于连接到用户特定的数据库。

在应用程序(服务提供商?)的某个位置,你需要设置特定的数据库配置,例如:

Config::set('database.connections.tenant.host', $tenant->host);
Config::set('database.connections.tenant.username', $tenant->username);
Config::set('database.connections.tenant.password', $tenant->password);
Config::set('database.connections.tenant.database', $tenant->database);

然后,您可以在模型中设置受保护的$connection属性以使用此辅助数据库连接。

class MyModel extends Model {
    protected $connection = 'tenant';
}