我的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',
);
然后,我有一些SHELL代码,它试图在一个DB中“找到”一些字段,以便它可以与另一个DB中的其他字段进行交叉检查,如下所示:
(...)
$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);
(...)
Model 1使用$default
,Model 2使用$db2
。Model2.php如下所示(代码片段):
public $useTable = 'Table';
public $primaryKey = 'key';
public $useDbConfig = "db2";
不幸的是,CakePHP似乎没有切换连接和/或DB,因为我得到了Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Model2.field1' in 'field list'
。
调试显示CakePHP在构建SQL语句(select ... from DEFAULT.MODEL2TABEL as MODEL2 ....
)时尝试使用默认的DB。
有什么想法吗?
提前感谢!
3条答案
按热度按时间ma8fv8wu1#
我浏览了CakePHP的文档,不明白为什么这个方法不起作用,但我确实找到了一个合适的解决方案,这个解决方案有文档记录,所以我不会认为它“不优雅”。如果你不同意我的答案,请不要“减1”我...这个解决方案确实起作用,解决了我的问题。
我会继续寻找“正确”(最好)的方式,并最终张贴回到这里...
无论如何,CakePHP允许你“在运行中”设置你的模型的数据源,这就是我最终的工作。
就在
$this->loadModel('Model');
之后放一条像$this->Model->setDatasource('datasource');
这样的线,它的工作就像一个魅力。这解决了我在SHELL中的问题,但是由于该方法在Model类下,因此它可能也可以在CONTROLLER中工作(http://api.cakephp.org/2.4/class-Model.html#_setDataSource)
mcdcgff02#
这里的问题在于方法:
无法正确启动模型。
你应该用传统的方式:
我很难弄清楚这一点...这可能也解决了许多其他问题。
我建议你以后选择避免使用
loadModel()
...jljoyd4f3#
我刚刚意识到,你 * 不能在属于不同数据库的表之间建立连接 *,即使你正确地配置了数据库连接。
事实上,查询生成器在查询中不包括dbname。
因此,如果您有:
您从cakephp2 ORM得到是:
而不是
我的解决方案是将问题转移到数据库。我只是在db1中创建一个视图,它Mapdb2的表b
这样,我就可以在cakephp中正常地处理表b,而不必知道数据来自db2