关键字UNQ_CATALOG_PRODUCT_SUPER_ATTRIBUTE_PRODUCT_ID_ATTRIBUTE_ID'的完整性约束违规

时间:2014-06-04 10:32:18

标签: magento configurable-product

我正在创建简单的产品,然后创建可配置的产品,然后将简单的产品与可配置的产品相关联。当我第一次运行代码时,它可以顺利地创建所有简单的产品,可配置的产品以及关联。但是,当我再次运行该代码时,它表示违反约束。显示重复的ID与上次创建的产品ID相同,当所有进程都正常时。

我的代码是以下代码。

$product_collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*');

$toinsertId = $product_collection->getLastItem()->getId() + 1;

$configurable_attribute = "art_print_sizes";
$attr_id = 133;
$simpleProducts = array();
$lowestPrice = 999999;

$attributes = Mage::getModel('catalogsearch/advanced')->getAttributes();
$attributeArray = array();
foreach ($attributes as $a) {
    if ($a->getAttributeCode() == 'art_print_sizes') {
        $count = 0;
        foreach ($a->getSource()->getAllOptions(false) as $option) {
            $option_id = $this->getOptionId("art_print_sizes", $option['label']);
            $sku = 'SK_' . '500' . '_' . strval($count);

            $sProduct = Mage::getModel('catalog/product');
            $sProduct
                ->setTypeId(Mage_Catalog_Model_Product_Type::TYPE_SIMPLE)
                ->setWebsiteIds(array(1))
                ->setStatus(Mage_Catalog_Model_Product_Status::STATUS_ENABLED)
                ->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE)
                ->setTaxClassId(5)
                ->setAttributeSetId(9)
                ->setSku($sku)
                // $main_product_data is an array created as part of a wider foreach loop, which this code is inside of
                ->setName($wholedata['name'] . " - " . $option['label'])
                ->setShortDescription($wholedata['short_description'])
                ->setDescription($wholedata['description'])
                ->setPrice(sprintf("%0.2f", $wholedata['attr_val'][$count]))
                ->setData($configurable_attribute, $option_id);

            $sProduct->save();

            array_push(
                $simpleProducts,
                array(
                    "id" => $sProduct->getId(),
                    "price" => $sProduct->getPrice(),
                    "attr_code" => 'art_print_sizes',
                    "attr_id" => $attr_id,
                    "value" => $option_id,
                    "label" => $option['label']
                )
            );

            $count++;
        }
    }
}

$cProduct = Mage::getModel('catalog/product');
$productData = array(
    'name' => 'Main configurable Tshirt',
    'sku' => 'tshirt_sku',
    'description' => 'Clear description about your Tshirt that explains its features',
    'short_description' => 'One liner',
    'weight' => 1,
    'status' => '1',
    'visibility' => '4',
    'attribute_set_id' => 9,
    'type_id' => 'configurable',
    'price' => 1200,
    'tax_class_id' => 0

);
foreach ($productData as $key => $value) {
    $cProduct->setData($key, $value);
}

$cProduct->setStockData(
    array(
        'manage_stock' => 1,
        'is_in_stock' => 1,
        'qty' => 0,
        'use_config_manage_stock' => 0
    )
);

$cProductTypeInstance = $cProduct->getTypeInstance();
$attribute_ids = array(133);

$cProductTypeInstance->setUsedProductAttributeIds($attribute_ids);
$attributes_array = $cProductTypeInstance->getConfigurableAttributesAsArray();
foreach ($attributes_array as $key => $attribute_array) {
    $attributes_array[$key]['use_default'] = 1;
    $attributes_array[$key]['position'] = 0;

    if (isset($attribute_array['frontend_label'])) {
        $attributes_array[$key]['label'] = $attribute_array['frontend_label'];
    } else {
        $attributes_array[$key]['label'] = $attribute_array['attribute_code'];
    }
}

$cProduct->setConfigurableAttributesData($attributes_array);

$dataArray = array();
foreach ($simpleProducts as $simpleArray) {
    $dataArray[$simpleArray['id']] = array();
    foreach ($attributes_array as $key => $attrArray) {
        array_push(
            $dataArray[$simpleArray['id']],
            array(
                "attribute_id" => $simpleArray['attr_id'][$key],
                "label" => $simpleArray['label'][$key],
                "is_percent" => 0,
                "pricing_value" => $simpleArray['pricing_value'][$key]
            )
        );
    }
}
$cProduct->setConfigurableProductsData($dataArray);
$cProduct->setCanSaveConfigurableAttributes(true);
$cProduct->setCanSaveCustomOptions(true);
$cProduct->save();

错误就像这样

enter image description here

产品ID 126已在上一个会话的数据库中添加。之前的会议很好地添加了所有必要的产品。

enter image description here

1 个答案:

答案 0 :(得分:0)

Magento不允许您更新可配置产品。因此,为了解决它,只需添加以下代码

if($productId){
    $resource = Mage::getSingleton('core/resource');
    $write = $resource->getConnection('core_write');
    $table = $resource->getTableName('catalog/product_super_attribute');
    $write->delete($table,"product_id = " . $productId);
}

之前

$cProduct->setConfigurableAttributesData($attributes_array);

所以你的最终代码将是

if($productId){
    $resource = Mage::getSingleton('core/resource');
    $write = $resource->getConnection('core_write');
    $table = $resource->getTableName('catalog/product_super_attribute');
    $write->delete($table,"product_id = " . $productId);
}
$cProduct->setConfigurableAttributesData($attributes_array);

注意:根据您的代码更改$ productId变量。您必须在此处传递产品ID。