Php 更新可配置产品会引发完整性约束冲突错误关于UNQ\U目录\U产品\U超级\U属性\U产品\U ID\U属性\U ID

Php 更新可配置产品会引发完整性约束冲突错误关于UNQ\U目录\U产品\U超级\U属性\U产品\U ID\U属性\U ID,php,magento,magento-1.9,configurable-product,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('cata

我有以下使用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\u products\u 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”,消息为“SQLSTATE[23000]:完整性约束冲突:1062键“UNQ\U目录\U产品\U超级\U属性\U产品\U ID\U属性\U ID”的重复条目“52-155”

有什么想法吗

+----------------------------+----------------------+------+-----+---------+----------------+
| 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\u product\u super\u属性表的说明。此表包含可配置产品和简单产品之间的关系。出现此错误是因为它试图添加已映射的相同简单项。如果您希望在不指定新的简单sku的情况下进行更新,可能的解决方法是从该表中删除相应可配置产品表的条目。在您的代码中,错误来自行-

$product->setConfigurableAttributesData($configurableAttributesData);
在更新之前,您可以添加一行检查您的可配置产品是否是新的

if ( $product_is_new ) {
    $product->setConfigurableAttributesData($configurableAttributesData);
}
以上是表catalog\u product\u super\u属性表的说明。此表包含可配置产品和简单产品之间的关系。出现此错误是因为它试图添加已映射的相同简单项。如果您希望在不指定新的简单sku的情况下进行更新,可能的解决方法是从该表中删除相应可配置产品表的条目。在您的代码中,错误来自行-

$product->setConfigurableAttributesData($configurableAttributesData);
在更新之前,您可以添加一行检查您的可配置产品是否是新的

if ( $product_is_new ) {
    $product->setConfigurableAttributesData($configurableAttributesData);
}

您得到的id在数据库中存在,因为它是唯一的,这就是抛出错误的原因。如果可能,请尝试从数据库中删除id,或者检查是否创建新产品或更新产品。您获得的id存在于数据库中,因为它是唯一的,这就是引发错误的原因。如果可能,尝试从db中删除id,或者检查是否创建新产品或更新产品