2

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

提前致谢。

4

2 回答 2

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 属性会更好,这样人们就不会认为这是一个错误。

关于索引:可能我需要重新索引所有数据,以防万一使用我的功能后,这没什么大不了的,因为使用产品节省updateAttributes时间从 9 秒到 0.75 秒。

于 2012-10-15T15:20:42.910 回答
0

处理类别时不能使用 updateAttributes() (类别不是属性)。您必须处理模型(目录/产品)...

由于索引生成(如果您的索引在“保存时更新”)和您的目录配置(您的类别都是“is_anchor”== true 吗?)这很慢但需要..

于 2012-10-15T15:09:21.833 回答