CakePHP 2.4.8中的setDataSource问题

时间:2014-05-15 21:29:15

标签: cakephp cakephp-2.4

我编写了一个行为Cascadable,它将记录合并到两个数据库中。它有点像CSS,其中更多本地样式覆盖全局。该行为使用$this->setDataSource()在数据库之间切换。这个问题一直持续到2.4.8发布时commit was made to the Model.php file

这是对行为的一种提取:

$Model->setDataSource( 'alt' );
$altData = $Model->find($findType, array(
     'contain' => false,
     'conditions' => array(
          $Model->alias.'.id' => $ids
     ),
     'callbacks' => 'before'
));

如果callbacks选项设置为false,则会出现关于仅存在于默认(父)数据源中的表的Missing Database Table错误。

我不确定我在这里做错了什么,但是在2.4.8升级之后它总是使用错误的(父)数据库而不是孩子。我可以将Model.php恢复到2.4.7版本来解决问题。我意识到这很难复制,因为它只会破坏我特定的数据库结构。

MySQL表架构示例:

父数据库表

CREATE TABLE `products` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `price` float(8,2) DEFAULT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  KEY `active` (`active`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 PACK_KEYS=0;

INSERT INTO `parent_db`.`products` (`id`, `name`, `price`, `active`) VALUES (NULL, 'Big Box of Goodies', '99.99', '0');

子数据库表

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');

查询结果

来自父DB

array(
    (int) 0 => array(
        'Product' => array(
            'id' => '1149',
            'name' => 'Big Box of Goodies',
            'price' => '99.99',
            'active' => false
        )
    )
)

工作的子DB中可级联行为(子记录合并到父记录中,忽略空值)

array(
    (int) 0 => array(
        'Product' => array(
            'id' => '1149',
            'name' => 'Small Box of Surprises',
            'price' => '99.99',
            'active' => true
        )
    )
)

解决方法:

使用setDataSource后手动设置schemaName可以解决我的问题。

$Model->setDataSource( 'alt' );
App::uses('ConnectionManager', 'Model');
$dataSources = ConnectionManager::enumConnectionObjects();
$Model->schemaName = $dataSources['alt']['database'];

0 个答案:

没有答案