Eine Sache, die die anderen Antworten übersehen haben, ist, dass wenn Sie setQty($qty)
, genau den Wert anwenden, den Sie angeben. Wenn jedoch ein Verkauf für dieses Produkt einen Moment vor dem Speichern durchgeführt wurde, könnte sich die ursprüngliche Menge geändert haben. Was Sie also wirklich tun möchten, ist Magento den Unterschied mitzuteilen, den Sie auf die Menge anwenden möchten.
Glücklicherweise bietet Magento 2 einen guten Mechanismus dafür. Schauen Sie sich an 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;
}
Hier sehen wir, dass, wenn Sie den qty_correction
Wert festlegen , die Differenz schrittweise angewendet wird, anstatt einen genauen Betrag anzuwenden.
Mein Vorschlag für eine sicherere Mengenersparnis lautet also:
/**
* @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
}