Одна вещь, которую другие ответы пропустили, это то, что если вы setQty($qty)
, она будет применять точное значение, которое вы предоставляете. Но если бы продажа была сделана для этого продукта за мгновение до сохранения, первоначальное количество могло измениться. Итак, что вы действительно хотите сделать, это сообщить Magento разницу, которую вы хотите применить к количеству.
К счастью, Magento 2 предоставляет хороший механизм для этого. Посмотрите на Magento\CatalogInventory\Model\ResourceModel\Stock\Item
:
protected function _prepareDataForTable(\Magento\Framework\DataObject $object, $table)
{
$data = parent::_prepareDataForTable($object, $table);
$ifNullSql = $this->getConnection()->getIfNullSql('qty');
if (!$object->isObjectNew() && $object->getQtyCorrection()) {
if ($object->getQty() === null) {
$data['qty'] = null;
} elseif ($object->getQtyCorrection() < 0) {
$data['qty'] = new \Zend_Db_Expr($ifNullSql . '-' . abs($object->getQtyCorrection()));
} else {
$data['qty'] = new \Zend_Db_Expr($ifNullSql . '+' . $object->getQtyCorrection());
}
}
return $data;
}
Здесь мы видим, что если вы установите qty_correction
значение, оно будет применять разницу постепенно, а не точное значение.
Итак, мое предложение по более безопасному количеству:
/**
* @var \Magento\CatalogInventory\Api\StockRegistryInterface
*/
protected $stockRegistry;
public function __construct(StockRegistryInterface $stockRegistry)
{
$this->stockRegistry = $stockRegistry;
}
/**
* Set the quantity in stock for a product
*
*/
public function applyNewQty($sku, $newQty)
{
$stockItem = $this->stockRegistry->getStockItemBySku($sku);
$origQty = $stockItem->getQty();
$difference = $newQty - $origQty;
$stockItem->setQtyCorrection($difference);
$this->stockRegistry->updateStockItemBySku($sku, $stockItem);
// note that at this point, $stockItem->getQty() is incorrect, so you'll need to reload if you need that value
}