Обновление настраиваемого продукта выдает ошибку нарушения ограничения целостности о UNQ_CATALOG_PRODUCT_SUPER_ATTRIBUTE_PRODUCT_ID_ATTRIBUTE_ID

У меня есть следующий скрипт, который использует модели 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» с сообщением «SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись« 52 -155 »для ключа« UNQ_CATALOG_PRODUCT_SUPER_ATTRIBUTE_PRODUCT_ID_ATTRIBUTE_ID »

Есть идеи?

0

Решение

+----------------------------+----------------------+------+-----+---------+----------------+
| 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);
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]