2016-09-12 65 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

這是我做到的一種方式。效率

$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更有效,避免了n + 1查詢問題。

你仍然會經歷很多迭代,但是迭代通過緩存的PHP變量的theta(n)可能低於n + 1查詢數據庫。沒有測試過,只是一個假設。

返回的結構是一個數組數組,其中子數組(也恰好是庫存項)具有產品ID和庫存狀態值。由於產品ID和庫存狀態值處於同一級別的嵌套,我們別無選擇,只能遍歷每個子數組以檢查product_id,選擇該子數組,並獲取庫存值。總之,我們不能僅僅使用hashmap,因爲子數組的鍵不是產品ID。

最終,其效率取決於您的使用情況。你很少會抓住所有庫存物品,除非進行大量出口。因此,最終目標是確保只保留配置的時間限制,以允許請求持續存在。

相關問題