我正在尝试将价格更新为许多产品(超过10.000)。我现在这样做的方式非常耗时。循环浏览所有产品并更新其中大多数产品的最佳方法是什么?
谢谢
看看magento.stackexchange.com/questions/42579/…–
—
Renon Stewart
我正在尝试将价格更新为许多产品(超过10.000)。我现在这样做的方式非常耗时。循环浏览所有产品并更新其中大多数产品的最佳方法是什么?
谢谢
Answers:
嗨,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秒。谢谢!
$product->getResource()->saveAttribute
动作。谢谢!!
编写一个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($allProductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allProductIds, $attrData, $storeId);
多重选择值如何工作?它是“添加”值还是覆盖其他预选值
多重选择通常会保存为逗号分隔的整数,例如27,42,4711
。因此,如果将值更改为1
,其他值将丢失。但是您可以做的事情CONCAT(value, ',1')
是,将新值添加到末尾,并以逗号分隔。我认为即使您将值相加两次也没问题,因为Magento在下次保存该项目时会对其进行过滤,而忽略第二个值。
<?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);
Mage::getSingleton('catalog/resource_product_action')
,以Mage::getModel('catalog/product_action')
完全相同的参数如上所述。
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
除了上述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);