我正在尝试使用以下代码将category_ids设置为产品:
<?php
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($product->getId()),
array("category_ids"=>$this->convertCategories($prod['categories']))
,0
);
?>
不幸的脚本退出时有例外:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'attribute_id' in 'where clause'
一些提示?我不想使用$product->setCategoryIds()->save()
,因为它的执行时间要长得多。
提前致谢。
答案 0 :(得分:1)
最后,我不得不稍微修改一个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属性会更好,所以人们不会认为它是一个bug。
关于索引:可能我需要重新索引所有数据,以防万一使用我的函数后,这不是什么大问题,因为使用updateAttributes
的产品保存从9秒到0.75。
答案 1 :(得分:0)
在处理类别(类别不是属性)时,不能使用updateAttributes()。 你必须处理模型(目录/产品)......
由于索引生成(如果你的索引在“保存时更新”)并且取决于你的目录配置(你的类别都是“is_anchor”== true?),它很慢 一切都很慢但需要......