最后,我不得不稍微修改一个 magento 函数并制定解决方法:
/**
* Updates product categories
*
* @param Mage_Catalog_Model_Product $product
* @param array $categoryIds
* @return MagentoImporter
*/
protected function updateCategories(&$product, $categoryIds)
{
/** @var Varien_Db_Adapter_Pdo_Mysql **/
$dbw = Mage::getSingleton('core/resource')->getConnection('core_write');
$productCategoryTable = Mage::getSingleton('core/resource')->getTableName('catalog/category_product');
$oldCategoryIds = $product->getCategoryIds();
$insert = array_diff($categoryIds, $oldCategoryIds);
$delete = array_diff($oldCategoryIds, $categoryIds);
if (!empty($insert)) {
$data = array();
foreach ($insert as $categoryId) {
if (empty($categoryId)) {
continue;
}
$data[] = array(
'category_id' => (int)$categoryId,
'product_id' => (int)$product->getId(),
'position' => 1
);
}
if ($data) {
$ris = $dbw->insertMultiple($productCategoryTable, $data);
}
}
if (!empty($delete)) {
foreach ($delete as $categoryId) {
$where = array(
'product_id = ?' => (int)$product->getId(),
'category_id = ?' => (int)$categoryId,
);
$ris = $dbw->delete($productCategoryTable, $where);
}
}
return $this;
}
感谢bixi指出关于category_ids的事实,奇怪的是虽然它不是一个属性,但在eav_attribute表中有一个名为category_ids的条目,magento正在使用此代码加载属性模型,但在尝试保存属性时崩溃。也许完全删除 category_ids 属性会更好,这样人们就不会认为这是一个错误。
关于索引:可能我需要重新索引所有数据,以防万一使用我的功能后,这没什么大不了的,因为使用产品节省updateAttributes
时间从 9 秒到 0.75 秒。