Une chose que les autres réponses ont manqué, c'est que si vous setQty($qty)
, il appliquera la valeur exacte que vous fournissez. Mais si une vente avait été faite pour ce produit un moment avant votre sauvegarde, la quantité d'origine aurait pu changer. Donc, ce que vous voulez vraiment faire, c'est dire à Magento la différence que vous souhaitez appliquer à la quantité.
Heureusement, Magento 2 fournit un bon mécanisme pour cela. Jetez un œil à 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;
}
Ici, nous voyons que si vous définissez la qty_correction
valeur, il appliquera la différence de manière incrémentielle au lieu d'appliquer un montant exact.
Donc, ma suggestion pour une sauvegarde de quantité plus sûre est la suivante:
/**
* @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
}