ทำไมฉันไม่สามารถโหลดผลิตภัณฑ์ตาม SKU โดยใช้ loadBySku () ได้


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');

แน่นอนฉันคาดหวังมากเกินไปจาก Magento ณ จุดนี้simpleวิธีการทำอะไรบางอย่าง (ง่าย ๆ คือแนวคิดที่ชัดเจนไม่คุ้นเคยกับวีโอไอพี)

// 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
แก้ไข Typos แล้ว;) ฉันพยายามทำความเข้าใจว่าเพราะเหตุใดคุณสมบัติพื้นฐานใน Magento จึงมีความซับซ้อน ถ้ามันเกี่ยวกับการเปลี่ยนแปลงสถาปัตยกรรมมันจะมีประโยชน์ในการเรียนรู้เกี่ยวกับสิ่งเหล่านี้ จำนวนครั้งที่เสียไปกับการพยายามเปลี่ยนฟังก์ชั่นเล็ก ๆ น้อย ๆ และเรียบง่ายเสร็จสมบูรณ์นั้นโง่ - ฉันได้รับโมดูลที่นำมาใช้ซ้ำได้ แต่บางครั้งก็ไม่ใช่ทุกสิ่งที่สามารถนำกลับมาใช้ใหม่ได้
เถ้า

คุณเข้าใจหรือไม่ว่าการโหลดผลิตภัณฑ์ทำงานอย่างไร ตอนแรกฉันรู้สึกแบบเดียวกัน แต่มันก็ดีขึ้น
musicliftsme

3
ฉันเข้าใจว่าบางครั้งฉันพบว่าวีโอไอพีนั้นล้าหลังเมื่อเทียบกับรูปแบบ
เถ้า

$ product = Mage :: getModel ('แคตตาล็อก / ผลิตภัณฑ์') -> 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

เกณฑ์มาตรฐานนี้ไม่เพียงพอความผันแปรที่เป็นไปได้ในการวิ่งครั้งเดียวจะสูง นอกจากนี้แคชภายในฐานข้อมูลอาจมีผลกระทบอย่างมากต่อผลลัพธ์ที่นี่
Flyingmana

1

ในการโหลดผลิตภัณฑ์ตาม SKU ใน magento คุณสามารถใช้รหัสต่อไปนี้:

$_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/


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_ObjectแทนMage_CatalogInventory_Model_Stock_Itemอื่น ๆ วิธีการเช่นMage_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.