【发布时间】:2017-01-18 08:40:53
【问题描述】:
Magento 2:获取产品库存数量和其他库存信息
如何在magento 2中获取产品库存数量和信息
【问题讨论】:
-
rakeshjesadiya.com/…查看详细答案。
标签: magento2
Magento 2:获取产品库存数量和其他库存信息
如何在magento 2中获取产品库存数量和信息
【问题讨论】:
标签: magento2
如果我们查看 StockItemRepository 类,get 方法需要参数 $stockItemId,而不是 $productId。参考:
我见过很多网站,其中库存商品 ID 与产品 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;
}
}
}
【讨论】:
实际上这个操作应该使用 \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);
}
}
【讨论】:
sql 查询。
如果您有产品对象,则只需使用以下内容:
echo $_product->getExtensionAttributes()->getStockItem()->getQty();
完整对象如下:
var_dump($_product->getExtensionAttributes()->getStockItem()->getData());
【讨论】:
此代码可帮助您获取产品数量
<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');
echo $StockState->getStockQty($productId);
?>
【讨论】:
学分: 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;
【讨论】:
如果你有产品对象,不想使用其他类,可以通过以下方式尝试。
// 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();
【讨论】: