magento2 - 如何启用/禁用产品的库存状态?

时间:2016-09-12 09:31:08

标签: magento2 stock

我试图了解产品的库存状态是不是存在/不足(代表每个州的整数都很好。我不一定需要"库存" /"缺货"字符串本身。

我尝试了各种各样的事情无济于事。

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

那么为什么没有让我们在库存工作呢?

1 个答案:

答案 0 :(得分: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。 Haven没有经过测试,只是一个假设。

返回的结构是一个数组数组,其中子数组(也恰好是一个库存项)具有产品ID和库存状态值。并且因为产品ID和库存状态值处于相同的嵌套级别,我们别无选择,只能遍历每个子数组以检查product_id,选择该子数组,并获取库存值。简而言之,我们不能仅使用hashmap,因为子数组的键不是产品ID。

最终,效率取决于您的使用案例。除非进行大规模出口,否则您很少会获得所有库存物品。因此,最终目标是真正保持在配置的时间限制内,允许请求持续存在。