在所有产品中更新属性的最快方法


Answers:


22

嗨,Magento通过以下代码提供属性

$product->setAttributeCode($newValue)
$ProductObject->getResource()->saveAttribute($product, 'attribute_Code');

例:

$product=Mage::getModel('catalog/product')->load($id);
$product->setSpecialFromDate('2010-10-28');
// below code use for time format 
$product->setSpecialFromDateIsFormated(true);
$product->getResource()->saveAttribute($product, 'special_from_date');

使用产品集合:

$productIds = array(1,3,2);
$products = Mage::getModel('catalog/product')->getCollection()
->addAttributeToFilter('entity_id', array('in' => $productIds));

foreach($products as $product)
{
    $product->setSpecialFromDate('2010-10-28');
    // below code use for time format 
    $product->setSpecialFromDateIsFormated(true);
    $product->getResource()->saveAttribute($product, 'special_from_date');


}

超级快!我试过Mage::getSingleton('catalog/product_api')->update();Mage::getSingleton('catalog/product_action')->updateAttributes()。product_api平均花费1.7秒,product_action平均花费1.0秒。但是,$product->getResource()->saveAttribute()平均花费0.04秒。谢谢!
2015年

是否有类似此方法的东西可以在特定商店级别更新属性?
罗比·阿弗里尔

Thx @Amit Bera-剩下1个问题;)还有一种方法可以一口气保存多个属性吗?其中一个将不得不绕过该$product->getResource()->saveAttribute动作。谢谢!!
snh_nl

@amit bera,请调查一下 magento.stackexchange.com/questions/201757/… 我该怎么办?
abhishek

@amit:我需要如何批量更改网站(多商店中的update属性)
zus 18'1

18

编写一个SQL查询。

第二好的方法(也是我推荐的方法): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes

u_maxx的代码示例:

$allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds();
$attributeCode = 'some_eav_attribute';
$attributeValue = NULL;
$attrData = array( $attributeCode => $attributeValue );
$storeId = 0;
// no reindex:<
Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allPro‌​ductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allPro‌​ductIds, $attrData, $storeId);

多重选择值如何工作?它是“添加”值还是覆盖其他预选值

多重选择通常会保存为逗号分隔的整数,例如27,42,4711。因此,如果将值更改为1,其他值将丢失。但是您可以做的事情CONCAT(value, ',1')是,将新值添加到末尾,并以逗号分隔。我认为即使您将值相加两次也没问题,因为Magento在下次保存该项目时会对其进行过滤,而忽略第二个值。


:这一次只更新1K行,不像以前那么快github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/...
B00MER

当我正确理解代码时,它每隔1000行写入一次,但它会连续更新所有行。
Fabian Blechschmidt 2014年

1
谢谢@FabianBlechschmidt!这是我的代码示例(gist):<?php $allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds(); $attributeCode = 'some_eav_attribute'; $attributeValue = NULL; $attrData = array( $attributeCode => $attributeValue ); $storeId = 0; Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allProductIds, $attrData, $storeId);
Max Uroda

1
这种方法的问题在于它不会为产品重新编制索引,因此您可能看不到前端的更改,而只在管理面板中看到它们。也重新索引更新后,你可以改变Mage::getSingleton('catalog/resource_product_action'),以Mage::getModel('catalog/product_action')完全相同的参数如上所述。
洗发水

1
@snh_nl更新了答案。希望这能回答您的问题
Fabian Blechschmidt

5

10k产品,使用SQL。EAV只会使水变得浑浊。每个问题都是最快的方法。

查找attribute_id

SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'

attribute_id从上面的查询中找到更新。

UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID

我想您可以使用update进行子选择,但为简单起见,最容易掌握两个SQL查询。

注意: entity_type_id = 4通常是产品EAV条目。如果您需要大量更新类别或客户属性,这将有所不同,并且根据要更新的属性类型而更新的表也将有所不同。另外,如果您有多商店设置,请确保并注意条件store_id


2

除了上述Fabian的答案,您可以一次更新多个字段。下面的示例只有2个(库存,库存状态),但是您可以根据需要使用任意数量。

    $product_ids = Mage::getModel('catalog/product')
        ->getCollection()
        ->addAttributeToFilter('status', array('eq' => 2)) //only disabled 
        ->getAllIds();

    $attrData = [
        ['attribute_one' => 1],
        ['attribute_two' => 1]
    ];

    $storeId = 0;
    Mage::getSingleton('catalog/resource_product_action')
       ->updateAttributes($product_ids, $attrData, $storeId);

因此,这就是如果您要更新所有产品而具有相同的属性值-您如何使它适应于更新说3个产品,所有相同的属性,但具有不同的属性值?thx
snh_nl

参见上方的阿米特·贝拉(Amit Bera)的答案:magento.stackexchange.com/a/43924/3433
西拉斯·帕尔默
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.