2016-09-12 1 views
2

제품의 재고 상태가 inock/outofstock인지 여부를 확인하려고합니다. 각 상태를 나타내는 정수는 괜찮습니다. "재고 있음"/ "재고 없음"문자열 자체는 반드시 필요하지 않습니다.magento2 - 제품의 재고 상태를 사용/사용 중지하는 방법은 무엇입니까?

나는 여러 가지 시도를 해 보았습니다.

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()); 

왜 getIsInStock이 작동하지 않습니까?

답변

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 + 1 쿼리 문제를 피하면서 대용량 n에 더 효율적입니다.

많은 양의 반복이 가능하지만 캐시 된 PHP 변수를 반복하는 itta (n)는 데이터베이스를 쿼리하는 n + 1보다 낮을 가능성이 큽니다. 테스트하지 않았다. 단지 가설이다.

반환되는 구조는 배열의 배열입니다. 하위 배열 (재고 항목 인 경우도 있음)에는 제품 ID 및 재고 상태 값이 있습니다. 제품 ID와 재고 상태 값이 동일한 중첩 수준에 있기 때문에 각 하위 배열을 반복하여 product_id를 확인하고 해당 하위 배열을 선택하고 재고 값을 가져올 수 밖에 없습니다. 즉, 하위 배열의 키가 제품 ID가 아니기 때문에 해시 맵을 사용할 수 없습니다.

궁극적으로이 효율성은 사용 사례에 따라 다릅니다. 대량 수출을하지 않는 한 모든 재고 항목을 수집하지는 않습니다. 따라서 궁극적 인 목표는 구성 된 시간 제한 내에있는 그대로 유지하는 것입니다. 요청이 지속되도록 허용됩니다.

관련 문제