Magento批量价格变动

时间:2011-02-28 18:47:52

标签: php sql magento

我要做的是,特定类别产品的批量价格变动。我们从供应商处收到建议的零售价格,但有时这些价格对我们不起作用。所以我们需要考虑产品的成本价格,例如,为产品增加20%,这样就足够了。成本足够+成本+ 0.2 *成本。现在我需要在所选类别的所有产品上执行此操作,所以这是我到目前为止所拥有的......

$category = Mage::getModel('catalog/category')->load(189); 

// load products from category id '189'
$products   = Mage::getModel('catalog/product')
                ->getCollection()  
                ->addCategoryFilter($category)  
                ->addAttributeToSelect('id'); 

foreach($products as $product) { 
    // get the current cost of the product
    $cost = $db->fetchRow("SELECT value FROM `m_catalog_product_entity_decimal` WHERE entity_id='" . $product->getId() . "' AND attribute_id='68'");
    $cost = $cost['value']; 
    $newCost = $cost + $cost*$percentage; 

    // update the product with a new cost
    $db->query("UPDATE `m_catalog_product_entity_decimal` SET value='$newCost' WHERE entity_id='" . $product->getId() . "' AND attribute_id='64'"); 
}

现在,我需要使用原始SQL,因为我的php服务器无法处理所有magento产品加载和保存(Magento 1.4在产品模型中有内存泄漏)。这就是为什么我只是从产品中选择“id”来获取最少量的数据。我也明白,做所有这些SQL查询都是浪费资源,这就是为什么我在这里。如果我的每个类别只有10个产品说,我会使用产品型号来更新成本并保存产品,但有时我在每个类别中有多达500个或更多的产品。

我希望将此缩减为一个SQL查询,并摆脱foreach循环和产品集合。 cost属性id是68,price属性id是64.对此的任何帮助都将非常感激。

修改
Magento为他们的数据库使用EAV模型。因此,对于我需要访问的属性,即“费用”和“价格”,它们都位于m_catalog_product_entity_decimal

所以产品价格属性在表格中如下所示

value_id    entity_type_id  attribute_id    store_id    entity_id   value
6401             4              64             0            2184      399.9500

value_id只是行的唯一值,entity_type_id 4表示这是一个产品属性。 attribute_id与实际属性相关联。在这种情况下,64是“price”的attribute_id。 Store_id无关紧要。 Entity_id是实际的产品ID,值是项目的实际价格。

4 个答案:

答案 0 :(得分:10)

老实说,B00MER有正确的想法,但我之前也不得不做类似的事情。另外,我觉得要写一点SQL。如果您只想将类别中所有产品的成本乘以1.2,您可以执行以下操作:

update catalog_product_entity_decimal
  set value = value*1.2
  where attribute_id = 75 and
        entity_id IN (select product_id from catalog_category_product
                    where category_id = X);

您无疑需要重新索引所有内容并检查结果以确保。显然,将X替换为您的目标类别,并且您似乎使用了m_的表格前缀,因此也要添加(我将其留给其他来到这里的搜索者)。

希望有所帮助!

谢谢, 乔

答案 1 :(得分:2)

离开Magento的ORM(因为它可能是资源匮乏)并不是一个好主意。 Here's a patch for 1.4 CE memory leak我会以“Magento”的方式做到这一点并保存所需的遗漏或部分数据的麻烦。如果您经常需要管理大量产品/类别数据,您也可以考虑Unigry's Data RapidFlow,高昂的价格标签,但非常值得每一分钱。

答案 2 :(得分:1)

考虑magmi,它可以做更多这样的事情并使用直接SQL。 它也适用于多商店设置。

答案 3 :(得分:0)

但是您可以使用magento数据对象进行更新 例如:

$product = Mage::getModel('catalog/product')->load($id);
$product->setData('price',$value);
$product->save();