【问题标题】:CakePHP - Load model on the fly using a different datasourceCakePHP - 使用不同的数据源动态加载模型
【发布时间】:2014-03-19 18:22:11
【问题描述】:

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

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

配置/数据库.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.

【问题讨论】:

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


    【解决方案1】:

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

    $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'));
    

    【讨论】:

    • 你是我的上帝!谢谢^^
    【解决方案2】:

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

    public $useDbConfig = 'database2';  
    

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

    【讨论】:

    • 这两种方法都假设从备用数据源引用的模型与控制器当前使用的模型相同。我正在尝试从不同的数据源加载完全不同的模型。有什么建议吗?
    • 这应该可以解决问题,但var 非常PHP4'ish。 public $useDbConfig 更干净。
    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多