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