1

场景:您已经使用数据库迁移以编程方式创建了产品属性。几个月后,您想将该属性从 a 更改VARCHARTEXT字段类型。

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

我的直觉是 Magento 的设置类不直接支持这一点,因为需要触及无数的表、需要更新的记录以及需要从一个表复制到另一个表的内容。

4

2 回答 2

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();
于 2013-05-27T13:55:21.780 回答
2

是的,我确认它不受支持。

您可以尝试使用 SQL 更新表,但这会很痛苦......

我将导出您的所有产品,应用修改您的属性后端表的升级脚本并重新导入您的所有产品。这样,magento 将自动填充您的属性使用的新表(catalog_product_entity_text)。

之后,您应该清理您的 varchar 表以删除链接到您的产品的未使用值(这些值将永远不会被删除或更新,因为您的属性产品现在是 TEXT)

于 2013-05-27T12:48:41.110 回答