使用Magento中的updateAttributes将category_ids分配给Product

时间:2012-10-15 14:14:20

标签: php magento product

我正在尝试使用以下代码将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(),因为它的执行时间要长得多。

提前致谢。

2 个答案:

答案 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?),它很慢 一切都很慢但需要......