更新可配置产品会引发有关UNQ_CATALOG_PRODUCT_SUPER_ATTRIBUTE_PRODUCT_ID_ATTRIBUTE_ID的完整性约束违规错误

时间:2016-08-23 10:26:39

标签: php magento magento-1.9 configurable-product

我有以下脚本,它使用Magento模型来创建或更新可配置产品。

// Method to create or update configurable product with configurable options
function createOrUpdateConfigurableProduct($product_data, $configurable_products_data)
{
    // Init product
    $product = Mage::getModel('catalog/product');

    // Load product id by sky
    $product_id = Mage::getModel('catalog/product')
        ->getIdBySku($product_data['sku']);

    // If product already exists
    if ($product_id)
    {
        // Load product
        $product->load($product_id);
    }

    // Set product data
    $product
        ->setTypeId('configurable')
        ->setAttributeSetId(4)
        ->setSku($product_data['sku'])
        ->setName($product_data['name'])
        ->setDescription($product_data['description'])
        ->setShortDescription($product_data['description'])
        ->setMetaTitle($product_data['name'])
        ->setMetaDescription($product_data['description'])
        ->setPrice($product_data['price'])
        ->setTaxClassId(2)
        ->setWebsiteIDs(array(1))
        ->setStatus(Mage_Catalog_Model_Product_Status::STATUS_ENABLED)
        ->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH)
        ->setStockData(array(
            'use_config_manage_stock' => 0,
            'manage_stock'            => 1,
            'is_in_stock'             => ($product_data['qty'] >= 1 ? 1 : 0)
        ));

    // Workout all the attribute ids used
    $used_attribute_ids = array();
    foreach ($configurable_products_data as $product_id => $options) {
        foreach ($options as $option) {
            if (!in_array($option['attribute_id'], $used_attribute_ids)) {
                $used_attribute_ids[] = $option['attribute_id'];
            }
        }
    }

    // Set configurable attributes data
    $product->getTypeInstance()->setUsedProductAttributeIds($used_attribute_ids);
    $configurableAttributesData = $product->getTypeInstance()->getConfigurableAttributesAsArray();
    $product->setCanSaveConfigurableAttributes(true);
    $product->setConfigurableAttributesData($configurableAttributesData);

    // Set configurable products data & save
    $product->setConfigurableProductsData($configurable_products_data);
    $product->save();
}

$configurable_products_data看起来像这样:

Array
(
    [49] => Array
        (
            [0] => Array
                (
                    [label] => 27 in.
                    [attribute_id] => 155
                    [value_index] => 47
                    [is_percent] => 0
                    [pricing_value] => 210
                )

            [1] => Array
                (
                    [label] => 32L
                    [attribute_id] => 156
                    [value_index] => 50
                    [is_percent] => 0
                    [pricing_value] => 210
                )

        )

    [50] => Array
        (
            [0] => Array
                (
                    [label] => 28 in.
                    [attribute_id] => 155
                    [value_index] => 48
                    [is_percent] => 0
                    [pricing_value] => 210
                )

            [1] => Array
                (
                    [label] => 32L
                    [attribute_id] => 156
                    [value_index] => 50
                    [is_percent] => 0
                    [pricing_value] => 210
                )

        )

    [51] => Array
        (
            [0] => Array
                (
                    [label] => 28 in.
                    [attribute_id] => 155
                    [value_index] => 48
                    [is_percent] => 0
                    [pricing_value] => 210
                )

            [1] => Array
                (
                    [label] => 34L
                    [attribute_id] => 156
                    [value_index] => 51
                    [is_percent] => 0
                    [pricing_value] => 210
                )

        )

)

当此代码运行时,在首次运行时 - 它可以正常工作并创建可配置产品。但是,在第二次运行中,它似乎无法更新现有的可配置产品,它会抛出以下隐含的错误消息:

  

未捕获的异常' PDOException' with message' SQLSTATE [23000]:完整性约束违规:1062重复条目' 52-155'对于关键' UNQ_CATALOG_PRODUCT_SUPER_ATTRIBUTE_PRODUCT_ID_ATTRIBUTE_ID''

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

+----------------------------+----------------------+------+-----+---------+----------------+
| Field                      | Type                 | Null | Key | Default | Extra          |
+----------------------------+----------------------+------+-----+---------+----------------+
| product_super_attribute_id | int(10) unsigned     | NO   | PRI | NULL    | auto_increment |
| product_id                 | int(10) unsigned     | NO   | MUL | 0       |                |
| attribute_id               | smallint(5) unsigned | NO   |     | 0       |                |
| position                   | smallint(5) unsigned | NO   |     | 0       |                |
+----------------------------+----------------------+------+-----+---------+----------------+

以上是表catalog_product_super_attribute表的描述。该表包含可配置和简单产品之间的关系。您收到此错误是因为它尝试添加已映射的相同简单项。如果要在不指定新的简单sku的情况下进行更新,可能的解决方法是从该表中删除相应可配置产品表的条目。在您的代码中,错误来自行 -

$product->setConfigurableAttributesData($configurableAttributesData);

在更新之前,您可以添加一行检查您的可配置产品是否是新产品。

if ( $product_is_new ) {
    $product->setConfigurableAttributesData($configurableAttributesData);
}
相关问题