我试图了解产品的库存状态是不是存在/不足(代表每个州的整数都很好。我不一定需要"库存" /"缺货"字符串本身。
我尝试了各种各样的事情无济于事。
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());
那么为什么没有让我们在库存工作呢?
答案 0 :(得分:0)
这是我做的一种方式。
$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。 Haven没有经过测试,只是一个假设。
返回的结构是一个数组数组,其中子数组(也恰好是一个库存项)具有产品ID和库存状态值。并且因为产品ID和库存状态值处于相同的嵌套级别,我们别无选择,只能遍历每个子数组以检查product_id,选择该子数组,并获取库存值。简而言之,我们不能仅使用hashmap,因为子数组的键不是产品ID。
最终,效率取决于您的使用案例。除非进行大规模出口,否则您很少会获得所有库存物品。因此,最终目标是真正保持在配置的时间限制内,允许请求持续存在。