首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有独立数据库的Laravel 5多租户应用程序-用户可以访问多个安装

有独立数据库的Laravel 5多租户应用程序-用户可以访问多个安装
EN

Stack Overflow用户
提问于 2015-03-09 12:34:59
回答 3查看 8.3K关注 0票数 16

在过去的几年中,我开发了一个非常定制的PHP/MySQL应用程序,用于许多客户端。到目前为止,我一直在为每个客户机创建一个新的数据库和新的安装。

这里的第一个明显的问题是使多个安装与任何代码更改保持最新;第二个问题是,每个安装都有大量用户;对于大多数客户端;其中一些用户是相同的--他们必须有许多独立的用户帐户和urls才能记住。

目前,我正在将应用程序移到Laravel 5,并研究多租户的最佳实现;因此,请提供一些关于最佳实现的建议。我以前用过拉拉维尔,但绝不是专家。

这是我的想法,就像设置一样。

1主数据库,保存用于:的表

  1. 所有用户帐户信息
  2. 访问控制表-用户可以访问哪些安装;他们在该安装上的用户级别是什么。
  3. 每个安装的配置表-数据库连接信息,基本配置等。

然后,为每个安装提供一个单独的数据库,其中包含该安装所需和提交给该安装的所有信息。

理想的设置是用户可以进入子域,即installationname.appname.com;使用主登录详细信息登录并自动进入所需的安装;或转到appname.com,登录,然后选择要连接到的安装。

我的问题是:

  1. 这是实现我想要的最好的安排吗?
  2. 存储用户正在查看的安装的最佳方法是什么(会话变量)
  3. 我可以在两个数据库之间定义一个模型吗?也许可以将一个连接定义为主连接,然后使用主数据库中的数据库连接信息动态地定义另一个连接以连接到正确的安装。-系统通常需要检查用户信息,以确定访问级别等。

我相信有很多问题我没有想到,但如果有人有任何联系或指导,可能会有帮助,这将是很好的。第一次问这样的问题,但在过去这里发现了大量的研究帮助,所以感谢社区!

更新-所以我想我现在有一种方法来使这个工作;使用上面所述的独立数据库;设置

代码语言:javascript
运行
复制
protected $connection = 'tenant_connection'

在模型中与租户相关的特定数据库内容。

然后,在头文件中的某个位置,根据已在登录/by子域上设置的会话变量设置所需的tenant_connection。

代码语言:javascript
运行
复制
$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.

假设关系将跨连接工作;我不明白为什么这不起作用;只是需要找到设置租户连接的最佳位置。

EN

回答 3

Stack Overflow用户

发布于 2016-06-04 12:57:51

最后我要做的是拥有所有的用户信息、安装的名称以及用户可以访问一个数据库中的安装的映射,以及单独数据库中的所有租户信息。

然后我有两个连接,mysql和mysql_tenant;其中mysql_tenant数据库不是预先设置的,而是动态的。

用户、安装和映射模型使用mysql连接,其他所有使用mysql_tenant。

为每个安装创建一个代码,并将其用作租户数据库的名称;将此代码存储在会话中。

使用中间件MultiTenant,使用以下关键行控制安装之间的切换:

代码语言:javascript
运行
复制
$tenant_id = session()->get('tenant');

\Config::set('database.connections.mysql_tenant.database', $dbname);
\DB::setDefaultConnection('mysql_tenant');

对于构建切换等的方法,还有很多,但这就是要点。

票数 4
EN

Stack Overflow用户

发布于 2015-03-09 12:42:36

这是很难回答你的大部分问题-因为它是特定于你的应用程序和意见为基础。

但我能回答的一点是,不同的模型可以有不同的数据库连接。因此,您的user模型使用了正常的默认连接--但是其他模型可以使用另一个连接:

代码语言:javascript
运行
复制
class Example extends Model {

    protected $connection= 'second_db_connection';

}

然后,在您的DB连接文件中-您将得到如下内容:

代码语言:javascript
运行
复制
return array(
    'connections' => array(
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database1',
            'username'  => 'user1',
            'password'  => 'pass1'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        'second_db_connection' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database2',
            'username'  => 'user2',
            'password'  => 'pass2'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
票数 3
EN

Stack Overflow用户

发布于 2015-03-09 12:43:21

Laravel 5是足够先进的,你应该能够有一个简单的安装与一个战略数据库,与明确的关系和钥匙。很少需要多个数据库。

如果你能对你的需求更加具体,我可以提供一个更具体的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28942145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档