2016-09-12 5 views
2

私は、製品の在庫状況が在庫/在庫不足かどうかを確認しようとしています(各状態を表す整数は問題ありません。magento2 - 製品の在庫状況を有効/無効にする方法を教えてください。

私は何の役に立たないことを試みました。

1)

$inStock = $obj->get('Magento\CatalogInventory\Api\Data\StockItemInterface')->getisInStock()' 

// Magento\CatalogInventory\Api\Data\StockItemInterface :: getisInStock returns true no matter what, even for 0qty products 
// summary: not useful. How do you get the real one? 

2)

$inStock = $obj->get('\Magento\CatalogInventory\Api\StockStateInterface')->verifyStock($_product->getId()); 

// test results for "verifyStock": 
// a 0 qty product is in stock 
// a 0 qty product is out of stock 
// summary: fail. find correct method, with tests. 

3)

$stockItemRepository = $obj->get('Magento\CatalogInventory\Model\Stock\StockItemRepository'); 
stockItem = $stockItemRepository->get($_product->getId()); 
$inStock = $stockItem->getIsInStock(); 

// Uncaught Magento\Framework\Exception\NoSuchEntityException: Stock Item with id "214" 
// summmary: is stockitem not 1to1 with proudctid? 

奇妙なことは、在庫数を取得するだけで正常に動作しています。

$availability = (String)$obj->get('\Magento\CatalogInventory\Api\StockStateInterface')->getStockQty($_product->getId(), $_product->getStore()->getWebsiteId()); 

なぜgetIsInStockは機能しませんか?

答えて

0

これは私がやった1つの方法でした。効率の

$stockItemResource = $obj->create('Magento\CatalogInventory\Model\ResourceModel\Stock\Item'); 

    // grab ALL stock items (i.e. object that contains stock information) 
    $stockItemSelect = $stockItemResource->getConnection()->select()->from($stockItemResource->getMainTable()); 
    $stockItems = $stockItemResource->getConnection()->fetchAll($stockItemSelect); 


    $inStock = null; 
    foreach($stockItems as $k => $item) { 
     if ($item['product_id'] == $_productId) { 
      $inStock = $item['is_in_stock']; 
      break; // not breaking properly. 'qz' still prints 
     } 
    } 

注:

は私ではなく、すべてを得るための、特に単一の項目を対象とする別の方法があることを確認しています。メソッドを使用するか、何らかの形で渡されたクエリを調整します。

しかし、この方法はおそらくn + 1のクエリの問題を避けるために、大きなnに対してより効率的です。

まだ多くのことが繰り返されていますが、キャッシュされたPHP変数を反復するtheta(n)はおそらくデータベースを照会するn + 1よりも低くなります。テストされていない、ただの仮説。

返される構造体は配列の配列です。サブ配列(これは在庫アイテムでもあります)は、製品IDと在庫状況の値を持ちます。また、製品IDと在庫状況値は同じレベルの入れ子になっているため、各サブアレイを繰り返してproduct_idを確認し、そのサブアレイを選択して在庫値を取得するしかありません。要するに、サブアレイのキーはプロダクトIDではないので、単にハッシュマップを利用することはできません。

最終的には、この効率はユースケースによって異なります。まれに大量輸出をしない限り、すべての在庫品目を取得します。したがって、究極の目標は、設定された時間制限内にとどまることだけです。要求が持続するために許可されています。

関連する問題