Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP 2.4.8中的setDataSource问题_Cakephp_Cakephp 2.4 - Fatal编程技术网

CakePHP 2.4.8中的setDataSource问题

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

我写了一个行为,它合并了两个数据库中的记录。它的工作原理有点像CSS,在CSS中,更多的本地样式覆盖了全局样式。该行为使用
$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'];