모든 제품에서 속성을 업데이트하는 가장 빠른 방법


답변:


22

안녕하세요 마 젠토는 아래 코드로 속성을 제공합니다.

$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 초가 걸렸 습니다 . 감사!
Joshua Pack

특정 상점 레벨에서 속성을 업데이트 할 수있는이 방법과 유사한 것이 있습니까?
로비 애 버릴

Thx @Amit Bera-1 질문 남음;) 여러 속성을 한 번에 저장하는 방법도 있습니까? $product->getResource()->saveAttribute행동 을 반복해야 할 것 입니다. 고마워!!
snh_nl 2016 년

@ amit bera, pls는이 magento.stackexchange.com/questions/201757/을 살펴보십시오 ... 어떻게해야합니까 ??
abhishek

@ amit : 웹 사이트를 대량 변경하는 방법이 필요합니다 (멀티 스토어의 업데이트 속성)
zus

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. 따라서 값을 say로 변경 1하면 다른 값이 손실됩니다. 그러나 당신이 할 수있는 일은 CONCAT(value, ',1')쉼표로 구분 된 끝에 새로운 가치를 추가하는 것을 의미합니다. 내가 생각하는 당신은 마 젠토는 그것을 항목이 저장되는 다음 번 필터링하고 두 번째 값을 무시하기 때문에 이것이 문제가되지 않습니다, 값을 두 번 추가 할 경우에도 마찬가지입니다.


이뿐만 아니라 빨리, 한 번에 1K 행을 업데이트합니다 : github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/...
B00MER에게

코드를 올바르게 이해하면 1000 행마다 쓰지만 행에서 모두 업데이트합니다.
Fabian Blechschmidt

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이 답변을 업데이트했습니다. 이것이 귀하의 질문에 답변
되기를

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

업데이트로 subselect를 수행 할 수 있다고 가정하지만 단순화를 위해 두 개의 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 2016 년

위의 Amit Bera의 답변 참조 : magento.stackexchange.com/a/43924/3433
Silas Palmer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.