我正在尝试将我的产品从我创建的第一个网站复制到我后来在多线程设置中添加的另外23个网站。 我有这个代码,我认为应该做的工作:
$arr_stores = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24);
$store_from = 1; // first store id
// get observer data and process each imported simple product - my products that need to be copied to other websites
$_event = $observer->getEvent();
$_adapter = $_event->getAdapter();
foreach($_adapter->getNewSku() as $sku => $value) {
if($value['type_id'] == 'simple'){
// load the next product - this loads product correctly
$_product = Mage::getModel('catalog/product')->setStoreId($store_from)->load($value['entity_id']);
// set the websites
$_product->setWebsiteIds($arr_stores);
$_product->save();
// clear the var
unset($_product);
}
}
但是我收到此错误消息:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`workoutlife`.`catalog_product_website`, CONSTRAINT `FK_CATALOG_PRODUCT_WEBSITE_WEBSITE_ID_CORE_WEBSITE_WEBSITE_ID` FOREIGN KEY (`website_id`) REFERENCES `core_website` (`website_id`) ON DELET)
有谁能告诉我为什么这种约束可能会失败? 为什么在这里有DELET?我不想删除任何东西。 TIA
答案 0 :(得分:0)
查看core_website表。我猜测数组中的一个或多个ID是无效的(在core_website中没有匹配的website_id)。这将违反错误中指定的约束。
catalog_product_website表的完整约束是:
CONSTRAINT `FK_CATALOG_PRODUCT_WEBSITE_WEBSITE_ID_CORE_WEBSITE_WEBSITE_ID` FOREIGN KEY (`website_id`) REFERENCES `core_website` (`website_id`) ON DELETE CASCADE ON UPDATE CASCADE
ON DELETE CASCADE表示如果从core_website表中删除条目,则catalog_product_website表中具有相同website_id的所有关联条目也将被删除。这是一种确保没有无用数据的方法。
您的示例中没有删除任何内容。 MySQL只是喜欢在失败时显示整个约束条目。
答案 1 :(得分:0)
这通常发生在无法找到产品时,例如没有这样的ID / SKU或参数为NULL然后模型返回新产品对象。由于这是空模型,因此需要您使用名称,价格等数据填写它。但是通过看起来不希望您想要的代码。
所以答案是首先检查$value['entity_id']
实际设置为某个并且不是NULL,然后再次检查$_product->getData()
或$_product->getId()
是否返回了某些内容(如果不是这意味着产品可以'找到了。