loadBySku ()를 사용하여 SKU로 제품을로드 할 수없는 이유는 무엇입니까?


27

개요

SKU에서 제품을로드하고 싶었습니다. 많은 기사, 블로그 게시물, 스택 오버플로 결과 등이 있습니다. SKU에서 제품을로드하기가 너무 어려운 이유는 무엇입니까?

// This method does not work (Of all, I expect this to work)
$product = Mage::getModel('catalog/product')->loadBySku($sku);

// These do not work either
$product = Mage::getModel('catalog/product')->loadByAttribute($sku, 'sku');
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);

// This does not work
$product = Mage::getModel('catalog/product')->load($sku, 'sku');

물론, 나는이 시점에서 simple무언가를 하는 방법으로 Magento에서 너무 많이 기대 하고 있습니다 (단순히 Magento가 익숙하지 않은 개념입니다)

// This works:
$product = Mage::getModel('catalog/product');
$product->load($product->getIdBySku($sku));

답변:


56
// This method does not work (Of all, I expect this to work)
$product = Mage::getModel('catalog/product')->loadBySku($sku);

방법 Mage_Catalog_Model_Product::loadBySku이 존재하지 않기 때문 입니다. 마술 방법이 아니라면 loadBySku클래스에서 호출 할 수있는 메소드가 있어야합니다 Mage_Catalog_Model_Product.

// These do not work either
$product->getModel('catalog/product')->loadByAttribute($sku, 'sku');
$product->getModel('catalog/product')->loadByAttribute('sku', $sku);

위의 오타가 포함되어 있습니다. 아래와 같습니다. 제품 객체로 작업을 수행 Mage::getModel()->load()하기 $product전에 무엇을 반환 할지 지정해야 합니다.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);

을 사용 loadByAttribute하면 스톡 및 미디어 갤러리와 같은 관련 개체를 얻을 수 없습니다. 자세한 내용 Mage_Catalog_Model_Abstract::loadByAttribute은 참조하십시오 .


1
오타가 수정되었습니다.) 마젠 토의 기본 기능이 왜 그렇게 복잡한 지 이해하려고 노력하고 있습니다. 아키텍처 변경과 관련이 있다면 이에 대해 배우는 것이 좋습니다. 작고 간단한 기능 변경을 완료하는 데 낭비되는 시간은 어리 석습니다. 재사용 가능한 모듈을 얻는 방법이 있지만 때로는 모든 것을 재사용 할 수있는 것은 아닙니다.
ash

그래도 제품 로딩이 어떻게 작동하는지 이해합니까? 처음에는 같은 느낌이 들었지만 더 좋아졌습니다.
musicliftsme

3
이해합니다. 때때로 Magento가 패턴과 비교할 때 거꾸로 있습니다.
ash

$ product = Mage :: getModel ( 'catalog / product')-> loadByAttribute ( 'sku', $ sku); 그것은 나를 위해 작동합니다 :) 감사합니다 !!!
jruzafa

@jruzafa, loadByAttribute()관련 제품 데이터가 모두있는 것은 아닙니다. 스톡 및 미디어 개체와 같은 항목이 누락됩니다.
musicliftsme

21

SKU에서 제품을로드하는 다양한 방법에 대한 실행 시간을 테스트했습니다. 이것이 가장 효율적입니다.

$product = Mage::getModel('catalog/product');
$product->load($product->getIdBySku($data['sku']));

테스트 :

$time_start = microtime();
$product1 = Mage::getModel('catalog/product')->loadByAttribute('sku', $data['sku']);
$time_end = microtime();
$time1 = $time_end - $time_start;

$time_start = microtime();
$product2 = Mage::getSingleton('catalog/product')->getCollection()
            ->addAttributeToFilter('sku', $data['sku'])
            ->addAttributeToSelect('*')
            ->getFirstItem();
        // do a full product load, otherwise you might get some errors related to stock item
        $product2->load($product2->getId());
$time_end = microtime();
$time2 = $time_end - $time_start;

$time_start = microtime();
$product3 = Mage::getModel('catalog/product');
$product3->load($product3->getIdBySku($data['sku']));
$time_end = microtime();
$time3 = $time_end - $time_start;

echo "<pre>time1: $time1\ntime2: $time2\ntime3: $time3</pre>";

테스트 결과 (초) :

time1: 0.024642
time2: 0.079715
time3: 0.007891

이 벤치 마크는 불충분하며 단 한 번의 실행에서 가능한 변동이 높습니다. 또한 DB 내부의 캐시는 결과에 큰 영향을 줄 수 있습니다.
Flyingmana

1

magento에서 SKU로 제품을로드하려면 다음 코드를 사용할 수 있습니다.

$_sku = 'leathershoes';
$_product = Mage::getModel('catalog/product')->loadByAttribute('sku',$_sku);
print $_product->getName(); // display product name

나는 이것을 매번 사용했으며 완벽하게 작동합니다. 여러 제품을로드하려면 다음을 시도하십시오

$productSku = array('234', '267', '4523', 'Leather shoes', 'skin care'); // insert product SKU here
$attributes = Mage::getSingleton('catalog/config')->getProductAttributes();
$collection = Mage::getModel('catalog/product')
                ->getCollection()                
                ->addAttributeToFilter('sku', array('in' => $productSku))
                ->addAttributeToSelect($attributes);

참조 소스 http://magentoexplorer.com/how-load-product-by-sku-or-id-in-magento


0

이미 토론했듯이이 방법 Mage_Catalog_Model_Product::loadBySku은 존재하지 않기 때문 입니다. 라는 메소드가 있어야합니다loadBySku클래스에서Mage_Catalog_Model_Product 합니다.

loadByAttribute()방법을 사용 하여 SKU별로 제품 세부 정보를 얻을 수도 있습니다 .

    $sku  =  $this->getRequest()->getParam('SKU');
    $catalogMageObj = Mage::getModel('catalog/product');
    $products = $catalogMageObj->loadByAttribute('sku', $sku);

    // get the products details which you want
    $data = array(
    'id' => $products->getEntityId(),
    'sku' => $products->getSku(),
    'name' => $products->getName(),
    'attribute_set_id' => (int)$products->getAttributeSetId(),
    'price' => $products->getPrice(),
    'status' => $products->getStatus(),
    'visibility' => $products->getVisibility(),
    'type_id' => $products->getTypeId(),
    'created_at' => $products->getCreatedAt(),
    'updated_at' => $products->getUpdatedAt(),
    'product_links' => $productstypes, 
    'custom_attributes'  => $custom_attributes
);

// return the response as array
return $data;

자세한 내용은이 기사를 참조하십시오. https://www.ipragmatech.com/ultimate-magento-developer-guide-get-product-details-using-restapi-magento-1-x/


0

주의 $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);!
99 %의 경우 작동 할 수 있지만 예외를 발생시키는 호출 과 같은 메소드에서 대신 속성 stock_item을 로드합니다 !Varien_ObjectMage_CatalogInventory_Model_Stock_ItemMage_CatalogInventory_Model_Observer::checkQuoteItemQty$stockItem instanceof Mage_CatalogInventory_Model_Stock_Item

가장 좋은 방법은 다음과 같습니다.

$product = Mage::getModel('catalog/product');
$product->setStoreId($storeId)->load($product->getIdBySku($sku));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.