gpt4 book ai didi

orm - 在 Magento ORM 中使用 boolean 字段

转载 作者:行者123 更新时间:2023-12-01 23:02:52 25 4
gpt4 key购买 nike

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

我试过了:

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

似乎没有人坚持对我的数据库的更改。

你应该如何使用 magento ORM 设置 boolean 字段?

编辑
查看我的数据库,mysql 将该字段存储为 tinyint(1),因此 magento 可能将其视为 int 而不是 bool。仍然无法设置它。

最佳答案

这个话题引起了我的好奇。虽然已经回答了,但我想分享我的发现,尽管我没有进行深入的追踪。

缓存是否启用/禁用无关紧要,表模式将被缓存。

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

关于orm - 在 Magento ORM 中使用 boolean 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12205251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com