此主题给我带来好奇心。尽管已经回答了,但我想分享我发现的内容,尽管我没有进行强烈的追踪。
无论缓存是启用还是禁用,表格模式都将被缓存。
它将在保存过程中被缓存。
Mage_Core_Model_Abstract -> save()
Mage_Core_Model_Resource_Db_Abstract -> save(Mage_Core_Model_Abstract $object)
Mage_Core_Model_Resource_Db_Abstract
public function save(Mage_Core_Model_Abstract $object)
{
...
//any conditional will eventually call for:
$this->_prepareDataForSave($object);
...
}
protected function _prepareDataForSave(Mage_Core_Model_Abstract $object)
{
return $this->_prepareDataForTable($object, $this->getMainTable());
}
Mage_Core_Model_Resource_Abstract
protected function _prepareDataForTable(Varien_Object $object, $table)
{
$data = array();
$fields = $this->_getWriteAdapter()->describeTable($table);
foreach (array_keys($fields) as $field) {
if ($object->hasData($field)) {
$fieldValue = $object->getData($field);
if ($fieldValue instanceof Zend_Db_Expr) {
$data[$field] = $fieldValue;
} else {
if (null !== $fieldValue) {
$fieldValue = $this->_prepareTableValueForSave($fieldValue, $fields[$field]['DATA_TYPE']);
$data[$field] = $this->_getWriteAdapter()->prepareColumnValue($fields[$field], $fieldValue);
} else if (!empty($fields[$field]['NULLABLE'])) {
$data[$field] = null;
}
}
}
}
return $data;
}
见线:$fields = $this->_getWriteAdapter()->describeTable($table);
Varien_Db_Adapter_Pdo_Mysql
public function describeTable($tableName, $schemaName = null)
{
$cacheKey = $this->_getTableName($tableName, $schemaName);
$ddl = $this->loadDdlCache($cacheKey, self::DDL_DESCRIBE);
if ($ddl === false) {
$ddl = parent::describeTable($tableName, $schemaName);
/**
* Remove bug in some MySQL versions, when int-column without default value is described as:
* having default empty string value
*/
$affected = array('tinyint', 'smallint', 'mediumint', 'int', 'bigint');
foreach ($ddl as $key => $columnData) {
if (($columnData['DEFAULT'] === '') && (array_search($columnData['DATA_TYPE'], $affected) !== FALSE)) {
$ddl[$key]['DEFAULT'] = null;
}
}
$this->saveDdlCache($cacheKey, self::DDL_DESCRIBE, $ddl);
}
return $ddl;
}
我们可以看到:
$ddl = $this->loadDdlCache($cacheKey, self::DDL_DESCRIBE);
将尝试从缓存中加载架构。
如果该值不存在:if ($ddl === false)
它会创建一个:$this->saveDdlCache($cacheKey, self::DDL_DESCRIBE, $ddl);
所以发生在这个问题上的问题会如果我们保存将要被改变的模式发生了(添加列等)。
因为它曾经是$model->save()
,架构将被缓存。 稍后,在添加新列和“执行保存”之后,它将从缓存(不包含新列)加载模式,结果为:新列的数据未能保存在数据库中
setEnabled )看起来像一个函数,可能不仅仅是一个普通的setter,你确定它是?此外,如果这是新创建的字段,请务必删除整个var/cache /目录 – kalenjordan
Enabled是我的字段名称。这可能是一个保留字的问题,虽然,虐待测试。所有缓存都关闭。 – MrGlass
只是从我身边注意。如果这些字段是新创建的,并且您没有清除缓存,那么保存它们也可能会有一些问题,因为在缓存中,Magento/Zend Framework会保存关于数据库的一些信息......比如表格列等。Magento还会保留一些缓存,即使缓存被禁用! – ceckoslab