가격을 많은 제품으로 업데이트하려고합니다 (10.000 이상). 내가 지금하고있는 방법은 매우 시간이 많이 걸립니다. 모든 제품을 반복하고 대부분의 제품을 업데이트하는 가장 좋은 방법은 무엇입니까?
감사
가격을 많은 제품으로 업데이트하려고합니다 (10.000 이상). 내가 지금하고있는 방법은 매우 시간이 많이 걸립니다. 모든 제품을 반복하고 대부분의 제품을 업데이트하는 가장 좋은 방법은 무엇입니까?
감사
답변:
안녕하세요 마 젠토는 아래 코드로 속성을 제공합니다.
$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
. 따라서 값을 say로 변경 1
하면 다른 값이 손실됩니다. 그러나 당신이 할 수있는 일은 CONCAT(value, ',1')
쉼표로 구분 된 끝에 새로운 가치를 추가하는 것을 의미합니다. 내가 생각하는 당신은 마 젠토는 그것을 항목이 저장되는 다음 번 필터링하고 두 번째 값을 무시하기 때문에 이것이 문제가되지 않습니다, 값을 두 번 추가 할 경우에도 마찬가지입니다.
<?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
업데이트로 subselect를 수행 할 수 있다고 가정하지만 단순화를 위해 두 개의 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);