2012-08-30 31 views
3

我正在为我的自定义实体在后端编辑页面上工作。我几乎所有的工作,包括保存一堆不同的文本字段。当我尝试设置布尔字段的值时,我遇到了一个问题。在Magento ORM中使用布尔字段

我曾尝试:

$landingPage->setEnabled(1); 
$landingPage->setEnabled(TRUE); 
$landingPage->setEnabled(0); 
$landingPage->setEnabled(FALSE); 

没有人可以坚持一个改变我的数据库。

你应该如何设置一个使用magento ORM的布尔型字段?

编辑 看着我的数据库,MySQL是存储领域一个TINYINT(1),使Magento的,可以看到这是一个int不是一个布尔值。仍然无法让它设置。

+0

setEnabled )看起来像一个函数,可能不仅仅是一个普通的setter,你确定它是?此外,如果这是新创建的字段,请务必删除整个var/cache /目录 – kalenjordan

+0

Enabled是我的字段名称。这可能是一个保留字的问题,虽然,虐待测试。所有缓存都关闭。 – MrGlass

+0

只是从我身边注意。如果这些字段是新创建的,并且您没有清除缓存,那么保存它们也可能会有一些问题,因为在缓存中,Magento/Zend Framework会保存关于数据库的一些信息......比如表格列等。Magento还会保留一些缓存,即使缓存被禁用! – ceckoslab

回答

5

删除var/cache/* - 即使新列已添加到MySQL表中,您的数据库模式也会被Magento缓存。

6

此主题给我带来好奇心。尽管已经回答了,但我想分享我发现的内容,尽管我没有进行强烈的追踪。

无论缓存是启用还是禁用,表格模式都将被缓存。

它将在保存过程中被缓存。

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(),架构将被缓存。 稍后,在添加新列和“执行保存”之后,它将从缓存(不包含新列)加载模式,结果为:新列的数据未能保存在数据库中