场景:您已经使用数据库迁移以编程方式创建了产品属性。几个月后,您想将该属性从 a 更改VARCHAR
为TEXT
字段类型。
创建后如何在保留数据的同时更改 EAV 属性的字段类型?
我的直觉是 Magento 的设置类不直接支持这一点,因为需要触及无数的表、需要更新的记录以及需要从一个表复制到另一个表的内容。
场景:您已经使用数据库迁移以编程方式创建了产品属性。几个月后,您想将该属性从 a 更改VARCHAR
为TEXT
字段类型。
创建后如何在保留数据的同时更改 EAV 属性的字段类型?
我的直觉是 Magento 的设置类不直接支持这一点,因为需要触及无数的表、需要更新的记录以及需要从一个表复制到另一个表的内容。
我不会假装这是最漂亮的解决方案,我怀疑它与数据库无关,但这是我的解决方案:
<?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();
是的,我确认它不受支持。
您可以尝试使用 SQL 更新表,但这会很痛苦......
我将导出您的所有产品,应用修改您的属性后端表的升级脚本并重新导入您的所有产品。这样,magento 将自动填充您的属性使用的新表(catalog_product_entity_text)。
之后,您应该清理您的 varchar 表以删除链接到您的产品的未使用值(这些值将永远不会被删除或更新,因为您的属性产品现在是 TEXT)