我的项目基于 Multi-Tenancy SaaS。

我有多个客户(公司),每个客户都有多个用户——他们都将使用相同的数据库布局。

每个客户端都有自己的数据库,所以在用户认证过程中,我想建立一个主数据库,将用户与该用户的公司数据库相关联。

每个数据库的结构都是一样的……只是数据不同。

这样我们就可以为不同的公司保留不同的数据库,这样就不会在数据库中混入数据。

编写应用程序时,客户端的数量(以及数据库的数量)是未知的,因此不可能在引导脚本中包含所有连接。

现在,我想要做的是,动态更改 bootstrap 中的数据库连接,或者能够为用户登录动态创建新连接。 Yii 中是否有一个简单的解决方案并仍然使用 AR ,查询 build 者?

我看到了这个解决方案,但对我不起作用 http://www.yiiframework.com/forum/index.php?/topic/5385-dynamic-db-connection/

这就是我今天的配置文件对于运行一个数据库的脚本的外观,我想调用一个主数据库来控制用户所属的数据库以及应用程序在 Yii 中使用的数据库,知道吗?

<? php

 $language = 'en';

  $currencyBaseCode = 'USD';

 $theme = 'default';

 $connectionString = 'mysql:host=localhost;port=3306;dbname=master';

 $username = 'root';

 $password = 'YOUR PASS';

 $memcacheServers = array( // An empty array means memcache is not used.

 array(

'host' => '127.0.0.1',

'port' => 11211, // This is the default memcached port.


 'weight' => 100,

  ),

  );

  $adminEmail = 'EMAIL ADDRESS';

  $installed = true; // Set to true by the installation process.

  $maintenanceMode = false; // Set to true during upgrade process or other maintenance tasks.

  $instanceConfig = array(); //Set any parameters you want to have merged into configuration array.

  //@see CustomManagement

  $instanceConfig['components']['request']['hostInfo'] = 'website url';

  $instanceConfig['components']['request']['scriptUrl'] = '/app/index.php';

  $urlManager = array (); // Set any parameters you want to customize url manager.
  ? >

最佳答案

在配置文件中定义 master 数据库,并使用普通的 AR 类连接到它以检索凭据。然后,关闭连接。

然后 extend the AR class, specifically the getDbConnection() method 。获取相关凭据,并将它们作为参数传递给新的 CDbConnection 对象。

获取凭据的初始数据库请求将是一个巨大的性能拖累,因此您应该使用 Redis 或 Memcached 将它们真正存储在内存中。 Yii 本身不会这样做。

有几种不同的方法可以解决这个问题:

  • 不同的前端 Controller 加载不同的配置文件,每个配置文件由单独的应用程序动态生成或销毁。
  • 一个大数据库。每条记录都有一个键来定义它属于哪个客户端。
  • 一个大数据库。可以通过使用客户端名称作为表名称的一部分来复制表。

  • 对于 Yii 来说,这些都不是一件容易的事,因为这并不是 Yii 的真正设计目的。

    关于database - 根据用户与主数据库的 Yii 动态数据库连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14789711/

    10-11 20:11
    查看更多