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

回答:


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 14

3
私はそれを理解しています、私は時々Magentoがパターンと比較して後方にあると思います。

$ 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

このベンチマークは不十分であり、1回の実行で発生する可能性のある変動は大きすぎます。また、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.