创建后更新Magento产品属性的数据库字段类型

时间:2013-05-27 12:39:55

标签: magento

方案:您已使用数据库迁移以编程方式创建了产品属性。几个月后,您希望将该属性从VARCHAR更改为TEXT字段类型。

如何在保留数据的同时更改EAV属性的字段类型?

我的直觉是,Magento的设置类不直接支持这种情况,因为需要触摸无数的表,需要更新的记录以及需要从表复制到的内容表

2 个答案:

答案 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,因此永远不会删除或更新的值)