Cannot add or update a child row: a foreign key constraint fails when creating product
-
12-12-2020 - |
Question
I have the following code to create a product, but when I try to do it it throws me this exception:
Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`magento`.`catalog_product_entity`, CONSTRAINT `FK_CAT_PRD_ENTT_ATTR_SET_ID_EAV_ATTR_SET_ATTR_SET_ID` FOREIGN KEY (`attribute_set_id`) REFERENCES `eav_attribute_set` (`attribute_set_id`) ON DE), query was: INSERT INTO `catalog_product_entity` (`entity_type_id`, `sku`, `created_at`, `updated_at`) VALUES (?, ?, '2017-09-11 18:54:40', '2017-09-11 18:54:40')
Here is my code:
$single = $return['response']['diffgrdiffgram']['NewDataSet']['Produtos']['0'];
$category = Mage::getModel('catalog/category');
$products = Mage::getModel('catalog/product');
$attr = Mage::getModel('novapc_allnations/attr')->load(1, 'entity_id');
$attr = array(
$attr->getData('fabricante'),
$attr->getData('part_number'),
$attr->getData('ean'),
$attr->getData('garantia'),
$attr->getData('peso'),
$attr->getData('preco_revenda'),
$attr->getData('preco_sem_st'),
$attr->getData('ncm'),
$attr->getData('largura'),
$attr->getData('altura'),
$attr->getData('profundidade'),
$attr->getData('subst_tributaria'),
$attr->getData('origem_produto'));
$control = Mage::getStoreConfig('allnations/general/id_allnations',
Mage::app()->getStore());
if ($control != 'sku' and $control == 'other') {
$control =
Mage::getStoreConfig('allnations/general/id_allnations_other', Mage::app()->getStore());
}
$products->setName($single['DESCRICAO'])
->setDescription($single['DESCRTEC'])
->setShortDescription($single['DESCRICAO'])
->setAvailable($single['DISPONIVEL'])
->setStatus($single['ATIVO'])
->setSku($single['CODIGO'])
->setWebsiteIds(array(1))
#->setAttributeSetId(9)
->setTypeId('simple')
->setCreatedAt(strtotime('now'))
->setTaxClassId(4)
->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH)
->setPrice($single['PRECOREVENDA'])
->setWeight($single['PESOKG'])
->setStockData(array(
'use_config_manage_stock' => 0,
'manage_stock' => 1,
'min_sale_qty' => 1,
'max_sale_qty' => 5,
'is_in_stock' => $single['DISPONIVEL'],
'qty' => $single['ESTOQUEDISPONIVEL']
));
$products->setData(array(
$control => $single['CODIGO'],
$attr['0'] => $single['FABRICANTE'],
$attr['1'] => $single['PARTNUMBER'],
$attr['2'] => $single['EAN'],
$attr['3'] => $single['GARANTIA'],
$attr['4'] => $single['PESOKG'],
$attr['6'] => $single['PRECOSEMST'],
$attr['7'] => $single['NCM'],
$attr['8'] => $single['LARGURA'],
$attr['9'] => $single['ALTURA'],
$attr['10'] => $single['PROFUNDIDADE'],
$attr['11'] => $single['SUBSTTRIBUTARIA'],
$attr['12'] => $single['ORIGEMPRODUTO']
));
$products->setStoreId(2);
# Pega a CATEGORIA e a SUBCATEGORIA
$mainCat = $single['CATEGORIA'];
$subCat = $single['SUBCATEGORIA'];
# Faz uma checagem para ver se a categoria e a sub-categoria são iguais,
# se forem, adiciona somente na principal, se não forem, adiciona nas duas
if ($mainCat == $subCat) {
$filter = $category->getCollection()
->addAttributeToFilter('name', ['eq' => $mainCat])
->addAttributeToSelect('*');
$filter = $filter->getFirstItem();
$products->setCategoryIds($filter->getId());
} else {
$filter = $category->getCollection()
->addAttributeToFilter('name', ['eq' => $mainCat])
->addAttributeToSelect('*');
$filter = $filter->getFirstItem()
->getId();
$subFilter = $category->getCollection()
->addAttributeToFilter('name', ['eq' => $subCat])
->addAttributeToSelect('*');
$subFilter = $subFilter->getFirstItem()->getId();
$products->setCategoryIds(array($filter, $subFilter));
}
Solution 3
Ok... I don't know why, but changing this:
$products->setAttributeSetId(4);
to this:
$products->setData([
'attribute_set_id' => 4
]);
worked.
Of course, I soft-coded it:
'attribute_set_id' => $products->getDefaultAttributeSetId(),
OTHER TIPS
I see this method is commented on your code:
->setAttributeSetId(9)
The attribute_set_id
is required for product creation. Also, check if the attribute_set_id
you specified exists in eav_attribute_set
table.
You have forgotten :
->setStoreId(1)
->setAttributeSetId(9) //ID of a attribute set named 'default'
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange