CakePHP 2.4.8中的setDataSource问题
我写了一个行为,它合并了两个数据库中的记录。它的工作原理有点像CSS,在CSS中,更多的本地样式覆盖了全局样式。该行为使用CakePHP 2.4.8中的setDataSource问题,cakephp,cakephp-2.4,Cakephp,Cakephp 2.4,我写了一个行为,它合并了两个数据库中的记录。它的工作原理有点像CSS,在CSS中,更多的本地样式覆盖了全局样式。该行为使用$this->setDataSource()在数据库之间切换。在2.4.8版本发布之前,这一直在运行 这里有一种从行为中提取的信息: $Model->setDataSource( 'alt' ); $altData = $Model->find($findType, array( 'contain' => false, 'conditio
$this->setDataSource()
在数据库之间切换。在2.4.8版本发布之前,这一直在运行
这里有一种从行为中提取的信息:
$Model->setDataSource( 'alt' );
$altData = $Model->find($findType, array(
'contain' => false,
'conditions' => array(
$Model->alias.'.id' => $ids
),
'callbacks' => 'before'
));
如果callbacks选项设置为false,则会出现关于仅存在于默认(父)数据源中的表的缺少数据库表错误
我不确定我在这里做错了什么,但在2.4.8升级之后,它总是使用错误的(父)数据库,而不是子数据库。我可以将Model.php恢复到2.4.7版本来解决这个问题。我意识到这很难复制,因为它只会破坏我非常特定的数据库结构
MySQL表架构示例:
父数据库表
子数据库表
查询结果
来自父数据库
来自具有工作级联行为的子数据库(子记录合并到父记录中,忽略空值)
解决方法:
在使用setDataSource后手动设置schemaName为我解决了这个问题
$Model->setDataSource( 'alt' );
App::uses('ConnectionManager', 'Model');
$dataSources = ConnectionManager::enumConnectionObjects();
$Model->schemaName = $dataSources['alt']['database'];
您是否测试过恢复此更改实际上可以解决您的问题?我现在不能测试它,但是看看实际的数据库源代码实现,看起来这个更改确实会破坏一些东西。一个简单的解决方法是在之后手动设置模式名称,但是我仍然会将其作为错误报告,并分别在中进行注释,以确保这是否是现在的预期行为。是的,恢复到2.4.7会修复该问题,甚至只恢复Model.php文件也会修复它。我谢谢你的建议。我为此提出了一个问题:,从2.5.1开始,该功能仍处于中断状态。
CREATE TABLE `products` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`price` float(8,2) DEFAULT NULL,
`active` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `active` (`active`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;
INSERT INTO `child_db`.`products` (`id`, `name`, `price`, `active`) VALUES (NULL, 'Small Box of Surprises', NULL, '1');
array(
(int) 0 => array(
'Product' => array(
'id' => '1149',
'name' => 'Big Box of Goodies',
'price' => '99.99',
'active' => false
)
)
)
array(
(int) 0 => array(
'Product' => array(
'id' => '1149',
'name' => 'Small Box of Surprises',
'price' => '99.99',
'active' => true
)
)
)
$Model->setDataSource( 'alt' );
App::uses('ConnectionManager', 'Model');
$dataSources = ConnectionManager::enumConnectionObjects();
$Model->schemaName = $dataSources['alt']['database'];