Yii Dynamic DB Connection根据用户和master数据库连接

时间:2013-02-09 15:40:53

标签: database yii multi-tenant

我的项目基于多功能SaaS。

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

每个客户端都有自己的数据库,因此在用户身份验证期间,我想构建一个主数据库,将用户与该用户的公司数据库相关联。

每个数据库的结构相同......只有数据不同。

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

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

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

我看到了这个解决方案,但没有为我工作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. 
  ? >

1 个答案:

答案 0 :(得分:0)

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

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

获取凭据的初始DB请求将是一个巨大的性能阻力,因此您应该使用Redis或Memcached将它们存储在内存中。 Yii本身并不这样做。

有几种不同的方法:

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

对于Yii来说,这些都不容易,因为这并不是Yii的目的。