web-dev-qa-db-ja.com

Magento 2:製品の在庫数量およびその他の在庫情報を取得する

Magento 2:製品の在庫数量およびその他の在庫情報を取得する

Magento2で製品の在庫数量と情報を取得する方法

4
VishalPandita

StockItemRepositoryクラスを見ると、getメソッドは$stockItemIdではなくパラメーター$productIdを必要としています。参照:

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

在庫アイテムID IS製品IDと同じではないため、同じIDであると想定すべきではないサイトを数多く見ました。

これを機能させるには、代わりに\Magento\CatalogInventory\Model\Stock\Itemクラスを使用し、代わりにproduct_idフィールドでモデルをロードします。 website_idフィールドとstock_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;
        }
    }
}
6
Robban

実際には、この操作は\ Magento\CatalogInventory\Api\StockRegistryInterfaceを使用して実行する必要があります。ここでは、製品IDまたはskuによって\ Magento\CatalogInventory\Api\Data\StockItemInterfaceを取得できます。また、さまざまな便利な方法を使用して、在庫情報(リンクされた製品)を取得できます。一般的な在庫情報については、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);
    }
}
4
Bartosz Kubicki

製品オブジェクトがある場合は、次を使用してください。

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

完全なオブジェクトは次のように見つけることができます:

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

このコードは、製品の数量を取得するのに役立ちます

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

クレジット: https://github.com/magento/magento2/issues/7057#issuecomment-256052729

実際には、\ Magento\CatalogInventory\Api\Data\StockStatusInterfaceがすべての質問に答えるはずです。

簡単に言うと、Magentoには、具体的な在庫(stockId)上の特定の製品(productId)の量(Qty)を表すStockItemエンティティがあります。 StockItemInterfaceは、データをデータストレージに「書き込む」場合に使用する必要があります(製品の更新量を更新して、MagentoをERPシステムと同期する、またはチェックアウトプロセス中に在庫を差し引くなど) )。

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;
0
Priyesh Doshi