CakePHP useDbConfig不工作?

CakePHP useDbConfig不工作?,php,cakephp,cakephp-2.0,cakephp-model,Php,Cakephp,Cakephp 2.0,Cakephp Model,因此,我的database.php如下所示: public $default = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'SOMEHOST', 'port' => 8889, 'login' => 'LOGIN', 'password' => 'PASSWORD', 'database' =>

因此,我的database.php如下所示:

public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'SOMEHOST',
    'port' => 8889,
    'login' => 'LOGIN',
    'password' => 'PASSWORD',
    'database' => 'DB1',
    'prefix' => '',
    'encoding' => 'utf8',
);

public $db2 = array(
    'datasource' => 'Datasources.Freetds',
    'persistent' => false,
    'host' => 'SOMEHOST',
    'port'=> 1433,
    'login' => 'LOGIN',
    'password' => 'PASSWORD',
    'database' => 'DB2',
    'prefix' => '',
    'encoding' => 'utf8',
);
(...)
$qry = $this->Model1->find('all', array(
        'fields' => array('Model1.id','Model1.field1'),
        'conditions' => array(
            'Model1.field2' => 'WAITING'),
        'recursive' => -1));

    $this->loadModel('Model2');
    $num_reg=count($qry);
    for ($loop=0; $loop<$num_reg;$loop++) {
        $registro = $this->Model2->find("first", array(
            'recursive' => -1,
            'fields' => array ('Model2.field1', 'Model2.field2'),
            'conditions' => array ('Model2.field1' => $qry[$loop]['Model1']['field1'])));
        var_dump($registro);
  (...)
然后我有一些SHELL代码,它试图“查找”一个DB中的一些字段,以便它可以与另一个DB中的其他字段交叉检查,如下所示:

public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'SOMEHOST',
    'port' => 8889,
    'login' => 'LOGIN',
    'password' => 'PASSWORD',
    'database' => 'DB1',
    'prefix' => '',
    'encoding' => 'utf8',
);

public $db2 = array(
    'datasource' => 'Datasources.Freetds',
    'persistent' => false,
    'host' => 'SOMEHOST',
    'port'=> 1433,
    'login' => 'LOGIN',
    'password' => 'PASSWORD',
    'database' => 'DB2',
    'prefix' => '',
    'encoding' => 'utf8',
);
(...)
$qry = $this->Model1->find('all', array(
        'fields' => array('Model1.id','Model1.field1'),
        'conditions' => array(
            'Model1.field2' => 'WAITING'),
        'recursive' => -1));

    $this->loadModel('Model2');
    $num_reg=count($qry);
    for ($loop=0; $loop<$num_reg;$loop++) {
        $registro = $this->Model2->find("first", array(
            'recursive' => -1,
            'fields' => array ('Model2.field1', 'Model2.field2'),
            'conditions' => array ('Model2.field1' => $qry[$loop]['Model1']['field1'])));
        var_dump($registro);
  (...)
不幸的是,CakePHP似乎没有切换连接和/或数据库,因为我得到了
错误:SQLSTATE[42S22]:未找到列:1054未知列“field list”中的“Model2.field1”

调试表明CakePHP在构建SQL语句时尝试使用默认数据库(
select…from default.MODEL2TABEL as MODEL2…

有什么想法吗


提前谢谢

我查阅了CakePHP的文档,但未能理解为什么这不起作用,但我确实找到了一个合适的解决方法,该方法有文档记录,因此我不会将其评为“不雅”。如果你不同意我的回答,请不要“负1”我。。。这个解决方案确实有效,解决了我的问题

我会继续寻找“正确的”(最好的)方法,并最终在这里发帖

不管怎么说,CakePHP允许您“动态”设置模型的数据源,而这正是我最终能做到的

就在
$this->loadModel('Model')之后放置一行,如
$this->Model->setDatasource('datasource')它就像一个符咒


这在SHELL中解决了我的问题,但由于该方法位于Model类下,因此它可能也在控制器中工作()

这里的问题是该方法:

$this->loadModel('Model');
无法正确启动模型

您应该使用传统方式:

App:使用('MyModel','Model');
$this->MyModel=newmymodel();
我很难弄明白这一点。。。这也可以解决许多其他问题。
我建议您以后避免使用
loadModel()

我刚刚意识到,即使正确配置了数据库连接,也无法在属于不同数据库的表之间进行连接

事实上,查询生成器在查询中不包含dbname

因此,如果您有:

  • 这是db1中的表a
  • 这是db2中的表b
您从cakephp2 ORM得到的是:

在(a.b_id==b.id)##不工作时从内部联接b中选择a.id、b.id
而不是

在(a.b_id==b.id)#工作时从db1.a内部连接db2.b上选择a.id、b.id
我的解决方案是将问题转移到数据库中。 我只是在db1中创建一个视图,它映射db2的表b

从db2.b创建视图b作为SELECT*;

这样,我就可以在表b上的cakephp中正常工作,而不知道数据来自db2

BTW,正如您可以看到的那样,
persistent
在两种配置中都设置为false