【发布时间】:2015-05-10 14:49:07
【问题描述】:
在过去的几年里,我开发了一个非常定制的 PHP/MySQL 应用程序,用于许多客户端。到目前为止,我一直在为每个客户端创建一个新数据库和新安装。
这里的第一个明显问题是让多个安装在任何代码更改时保持最新;第二个问题是每个安装都有大量的用户;对于大多数客户而言;其中一些用户是相同的 - 他们必须拥有多个单独的用户帐户和网址才能记住。
我目前正在将应用程序迁移到 Laravel 5 并研究多租户的最佳实现;所以寻找关于最佳实施的一些建议。我以前用过 Laravel,但绝不是专家。
这就是我在设置方面的想法。
1 个主数据库,其中包含以下表格:
- 所有用户帐户信息
- 访问控制表 - 用户可以访问的安装;他们在该安装中的用户级别是什么。
- 每次安装的配置表 - 数据库连接信息、基本配置等
然后为每个安装创建一个单独的数据库,其中包含该安装所需并提交给该安装的所有信息。
理想的设置是用户可以转到子域,即installationname.appname.com;使用他们的主登录详细信息登录并自动转到所需的安装;或访问 appname.com,登录,然后选择要连接的安装。
我的问题是:
- 这是实现我所寻求的最佳安排吗?
- 存储用户正在查看的安装的最佳方法是什么(会话变量)
- 我能否在 2 个数据库之间定义一个模型 - 也许将一个连接定义为主连接,然后使用主数据库中的数据库连接信息动态定义另一个连接以连接到正确的安装。 - 系统经常需要检查用户信息的访问级别等。
我确信有很多我没有想到的问题;但如果有人有任何可能有帮助的链接或指导,那就太好了。第一次提出关于 SO 的问题,但过去在这里找到了大量的研究帮助,因此感谢社区!
更新 - 所以我想我现在有办法完成这项工作;如上所述使用单独的数据库;设置
protected $connection = 'tenant_connection'
在与租户特定的数据库内容相关的模型中。
然后在头文件的某处根据已在登录/子域设置的会话变量设置所需的tenant_connection。
$tenant = Installation::where('installation', '=', $session['installation'])->first();
Config::set('database.connections.tenant_connection', array('driver' => 'mysql', 'host' => $tenant->db_hostname, 'username' => $tenant->db_username)... etc.
假设关系将跨连接起作用;我不明白为什么这不起作用;只需要找出设置租户连接的最佳位置。
【问题讨论】:
-
只是好奇,你能得到这个完整的功能吗?如果是这样,您可以发布您的解决方案作为答案吗?我也面临同样的问题
-
我也会喜欢...我正在寻找您为您所做的一切...
-
我会尝试发布我现在所做的作为答案,尽管它可能没有什么意义!
标签: php laravel laravel-5 multi-tenant