在Magento ORM中使用布尔字段

MrG*_*ass 3 orm boolean magento magento-1.5

我正在为我的自定义实体编写后端编辑页面.我几乎一切都在工作,包括保存一堆不同的文本字段.但是,在尝试设置布尔字段的值时,我遇到了问题.

我试过了:

$landingPage->setEnabled(1);
$landingPage->setEnabled(TRUE);
$landingPage->setEnabled(0);
$landingPage->setEnabled(FALSE);
Run Code Online (Sandbox Code Playgroud)

似乎没有人坚持对我的数据库进行更改.

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

编辑 查看我的数据库,mysql将字段存储为tinyint(1),因此magento可能会将此视为int而不是bool.尽管如此仍然无法得到它.

iva*_*dja 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());
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)

看到这一行: $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;
}
Run Code Online (Sandbox Code Playgroud)

我们可以看到:

$ddl = $this->loadDdlCache($cacheKey, self::DDL_DESCRIBE);

将尝试从缓存加载架构.

如果该值不存在: if ($ddl === false)

它会创建一个: $this->saveDdlCache($cacheKey, self::DDL_DESCRIBE, $ddl);

因此,如果我们保存将要更改的模型(添加列等),则会出现此问题中出现的问题.

因为它曾经是$model->save(),所以架构将被缓存.在他添加新列并"执行保存"之后,它将从缓存(不包含新列)加载架构,结果为:新列的数据无法保存在数据库中


kal*_*dan 5

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