【问题标题】:Magento 2: Get Product Stock Quantity and Other Stock InformationMagento 2:获取产品库存数量和其他库存信息
【发布时间】:2017-01-18 08:40:53
【问题描述】:

Magento 2:获取产品库存数量和其他库存信息

如何在magento 2中获取产品库存数量和信息

【问题讨论】:

标签: magento2


【解决方案1】:

如果我们查看 StockItemRepository 类,get 方法需要参数 $stockItemId,而不是 $productId。参考:

https://github.com/magento/magento2/blob/develop/app/code/Magento/CatalogInventory/Model/Stock/StockItemRepository.php#L202

我见过很多网站,其中库存商品 ID 与产品 ID 不同,我们不应该假设它是相同的 ID。

为了让这个工作,你可以使用\Magento\CatalogInventory\Model\Stock\Item 类,并通过product_id 字段加载模型。我也知道 website_idstock_id 字段,但据我所知,它还没有被使用(还没有)并且也存在于 M1 中。

它应该看起来像这样(代码未经测试):

<?php

namespace Vendor\Module\Model;

use \Magento\CatalogInventory\Model\Stock\Item;

class Mymodel
{
    /**
     * @var Item
     */
    protected $stockItem;

    /**
     * Mymodel constructor.
     *
     * @param Item $stockItem
     */
    public function __construct(Item $stockItem)
    {
        $this->stockItem = $stockItem;
    }

    /**
     * Description
     *
     * @param $productModel
     */
    public function getStockQtyByProductId($productModel)
    {
        try {
            $stockItem = $this->stockItem->load($productModel->getId(), 'product_id');

            return $stockItem->getQty();
        } catch (\Exception $e) {
            echo 'Something went wrong and was not handled: ' . $e->getMessage();
            exit;
        }
    }
}

【讨论】:

    【解决方案2】:

    实际上这个操作应该使用 \Magento\CatalogInventory\Api\StockRegistryInterface 来执行,这里我们可以得到 \Magento\CatalogInventory\Api\Data\StockItemInterface, by product id 或 sku,我们可以使用一堆有用的方法来获取库存信息 - 相关产品。对于一般库存信息,我建议探索 Magento\CatalogInventory\Api

    中声明的其他服务合同

    使用示例:

    <?php
    namespace Test\Test\Model;
    class Test
    {
        protected $_stockRegistry;
        public function __construct(\Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry)
        {
            $this->_stockRegistry = $stockRegistry;
        }
        public function getStockItem($productId)
        {
            return $this->_stockRegistry->getStockItem($productId);
        }
    }
    

    【讨论】:

    • 这对我有用,如GitHub issue中所述
    • 您不应在代码中直接使用sql 查询。
    【解决方案3】:

    如果您有产品对象,则只需使用以下内容:

    echo $_product->getExtensionAttributes()->getStockItem()->getQty();
    

    完整对象如下:

    var_dump($_product->getExtensionAttributes()->getStockItem()->getData());
    

    【讨论】:

      【解决方案4】:

      此代码可帮助您获取产品数量

      <?php 
          $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
          $StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');
          echo $StockState->getStockQty($productId);
      ?>
      

      【讨论】:

        【解决方案5】:

        学分: https://github.com/magento/magento2/issues/7057#issuecomment-256052729

        其实 \Magento\CatalogInventory\Api\Data\StockStatusInterface 应该回答你所有的问题。

        长话短说: Magento 有 StockItem 实体,它表示具体库存 (stockId) 上特定产品 (productId) 的数量 (Qty)。 当您想将数据“写入”到数据存储中(例如更新产品数量以将 Magento 与您的 ERP 系统同步或在结帐过程中扣除库存)时,应使用 StockItemInterface。

        StockStatusInterface 与之相反。它应该用于“读取”数据以进行表示(在前端)。将 StockStatus 视为包含每个特定产品的汇总库存数据的索引。

        因此,如果您想通过 product_id 获取产品库存状态(有货、缺货)。 您需要使用 StockStatusRepositoryInterface::getList(StockStatusCriteriaInterface $searchCriteria); 获取指定产品的 StockStatus 实体

        /** @var \Magento\CatalogInventory\Api\StockStatusCriteriaInterfaceFactory $stockStatusCriteriaFactory **/
                $criteria = $stockStatusCriteriaFactory->create();
                $criteria->setProductsFilter($productId);
                /** @var \Magento\CatalogInventory\Api\Data\StockStatusRepositoryInterface $stockStatusRepository **/
                $result = $stockStatusRepository->getList($criteria);
                $stockStatus = current($result->getItems());
                $stockStatus->getProductId();                 // product id
                $stockStatus->getQty();   // quantity of specified product
                $stockStatus->getStockStatus();     // Could be 
        // Magento\CatalogInventory\Model\Stock\Status::STATUS_OUT_OF_STOCK = 0;
        // or
        // Magento\CatalogInventory\Model\Stock\Status::STATUS_IN_STOCK = 1;
        

        【讨论】:

          【解决方案6】:

          如果你有产品对象,不想使用其他类,可以通过以下方式尝试。

          // For phtml file
          $prodObj = $_product->load($_product->getId()); // $_product object in list.phtml
          $stockItem = $prodObj->getExtensionAttributes()->getStockItem();
          $stockQty = $stockItem->getQty(); // $stockItemData = $stockItem->getData();
          
          // For php class file
          $stockItem = $prodObj->getExtensionAttributes()->getStockItem();
          $stockQty = $stockItem->getQty(); // $stockItemData = $stockItem->getData();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多