我有一个自定义的mysql表,我们将其称为module_identifiers
,并在我的模块中将其称为标识符的对应模型。这是我的安装脚本:
$installer = $this;
$installer->startSetup();
$installer->run("
CREATE TABLE `{$installer->getTable('module_identifiers')}` (
`module_identifier_id` int(11) NOT NULL AUTO_INCREMENT,
`identifier` varchar(255) NOT NULL,
`customer_id` int(11) unsigned NOT NULL,
`profile_name` varchar(100) NOT NULL,
`provider` varchar(50) NOT NULL,
PRIMARY KEY (`module_identifier_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
");
$installer->endSetup();
在我的Module/Model/Identifiers.php中
class Namespace_Module_Model_Identifiers extends Mage_Core_Model_Abstract {
protected function _construct() {
$this->_init('module/identifiers');
}
}
并在Module/Model/Mysql4/Identifiers.php中
class Namespace_Module_Model_Mysql4_Identifiers extends Mage_Core_Model_Mysql4_Abstract {
protected function _construct() {
$this->_init('module/identifiers', 'module_identifier_id');
}
}
因此,当我想写此表时,我一直在这样做:
Mage::getModel('module/identifiers')
->setIdentifier($profile['identifier'])
->setCustomerId($customer_id)
->save();
直到我添加了provider和profile_name列,这些都很好用,而这些列从未使用此方法进行更新:
Mage::getModel('module/identifiers')
->setIdentifier($profile['identifier'])
->setProvider($profile['provider'])
->setProfileName($profile['profile_name'])
->setCustomerId($customer_id)
->save();
我放下了自定义表,从core_resource列表中删除了模块的安装脚本,以便它可以再次运行(确实如此),并将新行添加到数据库中,但是它们缺少新列的数据。是的,我已经验证我的$ profile数组具有正确的数据。我究竟做错了什么?
最佳答案
如果有人最终在这里寻找这个非常令人沮丧的问题的答案,就是这样。
Magento将其表描述缓存在var/cache中(即使您没有在后端打开任何缓存)(请参见lib/Varien/Db/Adapter/Pdo/Mysql.php::describeTable())。当要插入或更新任何表时,它首先检查此缓存以查看是否有准备好对表的描述。如果找到一个,它将返回表的缓存描述,并且如果传递给$ model-> save()的数组中的任何字段未出现在此缓存描述中,则它们不会插入到表,导致上述症状。
因此,如果您想在phpMyAdmin中插入列(甚至重新运行安装脚本),Magento将看不到它们,也不会插入数据。
荒谬的简单解决方案就是要做一个rm -rf var/cache/*
EDIT 2014.01.10:如果您的站点使用了内存缓存,则还需要清除此缓存以使更改生效。
关于php - Magento的魔术 setter 仅更新了一些数据库列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5224581/