为什么我不能使用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');

当然,我现在对Magento期望simple做的事情太多了(简单是Magento显然不熟悉的概念)

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

Answers:


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
笔录已得到纠正;)我只是想了解一下Magento的基本功能为何如此复杂。如果与体系结构更改有关,那么了解这些更改将很有用。试图完成小而简单的功能更改所花费的时间是愚蠢的-我获得了可重用的模块是这样的方式,但是有时并非所有的东西都可以重用。

您是否了解产品加载的工作方式?一开始我也有同样的感觉,但是情况会变得更好。
musicliftsme 2014年

3
我了解这一点,有时我发现Magento与模式相比是倒退的。

$ product = Mage :: getModel('catalog / product')-> loadByAttribute('sku',$ sku); 它对我有用:)谢谢!!!
jruzafa

@jruzafa,请注意loadByAttribute(),您没有获得所有相关的产品数据。它将丢失诸如库存和媒体对象之类的东西。
musicliftsme,2015年

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

要在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_itemVarien_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));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.