【问题标题】:magento2 - How to get a product's stock status enabled/disabled?magento2 - 如何启用/禁用产品的库存状态?
【发布时间】:2016-09-12 09:31:07
【问题描述】:

我正在尝试获取产品的库存状态是否为 instock/outofstock(代表每个状态的整数都可以。我不一定需要“in stock”/“out of 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());

那么为什么 getIsInStock 不起作用?

【问题讨论】:

    标签: magento2 stock


    【解决方案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 可能更有效,避免了 n+1 的查询问题。

    您最终还是会迭代很多次,但可能迭代缓存的 PHP 变量的 theta(n) 可能低于查询数据库的 n+1。没有测试,只是一个假设。

    返回的结构是一个数组数组,其中子数组(也恰好是库存商品)包含产品 ID 和库存状态值。并且由于产品 ID 和库存状态值在同一层嵌套,我们只能遍历每个子数组来检查 product_id,选择该子数组,然后获取库存值。简而言之,我们不能只使用 hashmap,因为子数组的键不是产品 ID。

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

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 1970-01-01
      • 2022-01-21
      • 2017-10-09
      • 2012-03-08
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多