如何在 CakePHP 中为一个模型动态使用多个数据库

2022-08-31 00:06:59

好吧,我的第一个问题被修改了很多次,以至于我选择删除它并重新表述我的问题。我制作了一个具有不同模型名称的小型测试用例项目,以为我的问题找到合适的解决方案。

警告:不要将数据库混合在一起

动机:我将用户数据分离到多个数据库中,以解决法律和性能问题。

目前,我正在研究一个具有多个'的CakePHP项目,每个项目都有自己的数据库,其中包含多个(是其中一个)。现在,我需要先解释一些事情:UserUsercars

每个人都有自己的数据库(不是表,而是数据库),因此数据库名称如下所示。User

  • [数据库] (这是应用程序的主数据库)app
    • [表]users
    • [表] (与此问题无关permissions)
  • [数据库] ( 1 拥有整个数据库app_user1User.id)
    • [表] (完全由 1 拥有的carsUser.id
  • [数据库] ( 2 拥有整个数据库app_user2User.id)
    • [表] (一张完全由2人拥有的桌子)carsUser.id
  • 等。。。

我做了一个小图纸,可以澄清数据库/定义及其与模型的关系:

How to use multiple databases dynamically for one model in CakePHP

问题!!!

我不知道要连接到哪个数据库,直到登录's和他们的数据库是动态创建的,所以我不能使用.UserUserapp/Config/database.php

因此,我目前正在编写一个关于 and 类的扩展,以绕过 CakePHP 的基本数据库行为。因此,模型知道要使用哪个数据库。但我只是有一种感觉,这可以做得更容易!ModelConnectionManagerCar

所以我想这一切都归结为一个问题:

有没有更简单的方法可以做到这一点?!

感谢任何愿意花时间和精力阅读和理解我的问题的人!


答案 1

这位绅士奥利维尔)也有同样的问题!(一年前)他为s写了一个小改编!它非常小,事实证明,它可以在1.32.x中工作。Controller

无论如何,这是我的最终解决方案,我把它放在:app/Model/AppModel.php

class AppModel extends Model
{
  /**
   * Connects to specified database
   *
   * @param String name of different database to connect with.
   * @param String name of existing datasource
   * @return boolean true on success, false on failure
   * @access public
   */
    public function setDatabase($database, $datasource = 'default')
    {
      $nds = $datasource . '_' . $database;      
      $db  = &ConnectionManager::getDataSource($datasource);

      $db->setConfig(array(
        'name'       => $nds,
        'database'   => $database,
        'persistent' => false
      ));

      if ( $ds = ConnectionManager::create($nds, $db->config) ) {
        $this->useDbConfig  = $nds;
        $this->cacheQueries = false;
        return true;
      }

      return false;
    }
}

这是我在我的:app/Controller/CarsController.php

class CarsController extends AppController
{
  public function index()
  {
    $this->Car->setDatabase('cake_sandbox_client3');

    $cars = $this->Car->find('all');

    $this->set('cars', $cars);
  }

}

我敢打赌,我不是第一个或最后一个有这个问题的人。所以我真的希望这些信息能找到人们和CakePHP社区。


答案 2

我不喜欢在代码中写下数据库的实际名称的想法。对于多个数据库,您有数据库.php文件,您可以在其中根据需要设置任意数量的数据库。

如果要动态地“切换”特定模型数据库,请使用 setDataSource 方法。(请参阅此处)

例如,如果您有两个数据库,则可以在数据库中将它们定义为.php文件为“默认”和“沙盒”作为示例。

然后,在您的代码中:

$this->Car->setDataSource('sandbox');

沙盒是配置的名称,数据库的实际名称仅在数据库.php文件中写入一次。


推荐