CakePHP - 使用不同的数据源动态加载模型

时间:2014-03-19 18:22:11

标签: php cakephp cakephp-2.0 cakephp-2.1 cakephp-2.3

我试图在控制器中使用ClassRegistry :: init('ModelName')或loadModel('ModelName')动态加载模型。

我在database.php配置中定义了两个数据库:

配置/ database.php中

public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'username',
    'password' => 'password',
    'database' => 'database1',
    'prefix' => '',
);

public $database2 = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'same_username',
    'password' => 'same_password',
    'database' => 'database2',
    'prefix' => '',
    //'encoding' => 'utf8',
);

我遇到问题的地方是使用Cake能够动态生成模型,从database2正确加载和引用表。存储在database2中的表不会(也不会)与它们关联的“ModelName.php”。

我尝试过以下方法:

// Method 1
$this->FirstTable->setDataSource('database2');
ClassRegistry::init('TableFromSecondDatabase')->find('all');
$data = $this->TableFromSecondDatabase->find('all');

// Method 2
$this->loadModel('TableFromSecondDatabase');
$this->TableFromSecondDatabase->find('all');

这两种方法都给我以下错误:

Error: Table TableFromSecondDatabase for model database 2 was not found in datasource default.

2 个答案:

答案 0 :(得分:4)

您可以像这样直接实例化模型:

$model_1 = new Model(array('table' => 'the_table', 'ds' => 'default'));
$model_2 = new Model(array('table' => 'the_table', 'ds' => 'database2'));

或者如果你想创建一个模型来放置一些逻辑,你可以稍后以相同的方式实例化它:

App::uses('YourModel', 'Model');
$model_1 = new YourModel(array('ds' => 'default'));
$model_2 = new YourModel(array('ds' => 'database2'));

答案 1 :(得分:3)

在使用其他数据库的模型中:

public $useDbConfig = 'database2';  

它不一定是“动态”,但除非你在两个数据库中都有相同的对象,否则这样可以正常工作。如果您确实需要连接到同一对象的多个数据库,那么您应该阅读How to use multiple databases dynamically for one model in CakePHP