2016-09-12 3 views
2

Я пытаюсь выяснить, является ли состояние запаса продукта instock/outofstock (целые числа, представляющие каждое состояние, в порядке. Мне не обязательно нужны строки «на складе»/«нет в наличии»).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.

Вы по-прежнему продолжаете многократно повторяться, но, возможно, тета (n) итерирования через кэшированную переменную PHP, вероятно, ниже, чем n + 1, запрашивая базу данных. Не проверял, просто гипотеза.

Возвращенная структура представляет собой массив массивов, где подматрица (которая также является элементом запаса) имеет идентификатор продукта и значение состояния запаса. И поскольку идентификатор продукта и значение состояния запаса находятся на одном уровне вложенности, у нас нет выбора, кроме как итерации через каждый вспомогательный массив для проверки product_id, выбора этого подматрица и захвата значения запаса. Короче говоря, мы не можем просто использовать hashmap, так как ключи sub-массива не являются идентификаторами продукта.

В конечном счете, эффективность этого зависит от вашего варианта использования. Редко вы возьмете все запасные предметы, если не будете массовым экспортом. Таким образом, конечная цель состоит в том, чтобы действительно оставаться в пределах установленного срока, чтобы запрос сохранялся.

 Смежные вопросы

  • Нет связанных вопросов^_^