CakePHP useDbConfig不工作?
因此,我的database.php如下所示: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' =>
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中正常工作,而不知道数据来自db2BTW,正如您可以看到的那样,persistent
在两种配置中都设置为false