方案:您已使用数据库迁移以编程方式创建了产品属性。几个月后,您希望将该属性从VARCHAR
更改为TEXT
字段类型。
如何在保留数据的同时更改EAV属性的字段类型?
我的直觉是,Magento的设置类不直接支持这种情况,因为需要触摸无数的表,需要更新的记录以及需要从表复制到的内容表
答案 0 :(得分:4)
我不会假装这是最漂亮的解决方案,我怀疑它是数据库不可知的,但这是我的解决方案:
<?php
/** @var $this Mage_Eav_Model_Entity_Setup */
$this->startSetup();
$attribute_id = $this->getAttribute(
Mage_Catalog_Model_Product::ENTITY,
'your_attribute_code',
'attribute_id'
);;
if (!is_numeric($attribute_id)) {
Mage::throwException("Couldn't run migration: Unable to find attribute id");
}
/** @var Varien_Db_Adapter_Pdo_Mysql $connection */
$connection = $this->getConnection();
$connection->beginTransaction();
/**
* Copy the data from the VARCHAR table to the TEXT table.
*/
$connection->query("
INSERT INTO catalog_product_entity_text
(entity_type_id, attribute_id, store_id, entity_id, value)
SELECT
entity_type_id, attribute_id, store_id, entity_id, value
FROM catalog_product_entity_varchar
WHERE attribute_id = ?
",
array($attribute_id)
);
/**
* Update eav_attribute to use the text table instead of the varchar.
*/
$connection->query("UPDATE eav_attribute SET backend_type = 'text' WHERE attribute_id = ?", array($attribute_id));
/**
* Delete the attribute values from the VARCHAR table.
*/
$connection->query("DELETE FROM catalog_product_entity_varchar WHERE attribute_id = ?", array($attribute_id));
$connection->commit();
$this->endSetup();
答案 1 :(得分:2)
是的,我确认它不受支持。
您可以尝试使用SQL更新表,但这会很痛苦......
我会导出您的所有产品,应用修改属性后端表的升级脚本并重新导入所有产品。 这样,magento将自动填充您的属性使用的新表(catalog_product_entity_text)。
之后,您应该清理varchar表以删除链接到您的产品的未使用值(由于您的属性产品现在为TEXT,因此永远不会删除或更新的值)