Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
magento2-如何获得产品';s库存状态是否启用/禁用?_Magento2_Stock - Fatal编程技术网

magento2-如何获得产品';s库存状态是否启用/禁用?

magento2-如何获得产品';s库存状态是否启用/禁用?,magento2,stock,Magento2,Stock,我正在尝试获取产品的库存状态是否为instock/outofstock(表示每个状态的整数都可以。我不一定需要“in-stock”/“out-of-stock”字符串本身) 我试过各种各样的方法,但都没有用 (一) (二) (三) 奇怪的是,获取库存量效果很好 $availability = (String)$obj->get('\Magento\CatalogInventory\Api\StockStateInterface')->getStockQty($_product-&g

我正在尝试获取产品的库存状态是否为instock/outofstock(表示每个状态的整数都可以。我不一定需要“in-stock”/“out-of-stock”字符串本身)

我试过各种各样的方法,但都没有用

(一)

(二)

(三)


奇怪的是,获取库存量效果很好

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

那么为什么getIsInStock不起作用呢?

这是我做这件事的一种方式

    $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变量的θ(n)可能低于查询数据库的n+1。还没有测试,只是一个假设

返回的结构是一个数组数组,其中子数组(碰巧也是一个库存项目)具有产品ID和库存状态值。由于产品ID和库存状态值处于相同的嵌套级别,我们别无选择,只能遍历每个子数组来检查产品ID,选择子数组,然后获取库存值。简而言之,我们不能仅仅利用hashmap,因为子数组的键不是产品id

最终,这种方法的效率取决于您的用例。除非进行大规模出口,否则很少会抓取所有库存物品。因此,最终的目标是在允许请求持久化的配置时限内保持不变

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