Satu hal yang terlewatkan oleh jawaban lain adalah jika Anda setQty($qty)
, itu akan menerapkan nilai persis yang Anda berikan. Tetapi jika penjualan dilakukan untuk produk itu sesaat sebelum penyimpanan Anda, jumlah asli mungkin bisa berubah. Jadi yang ingin Anda lakukan adalah memberi tahu Magento perbedaan yang ingin Anda terapkan pada qty.
Untungnya, Magento 2 menyediakan mekanisme yang bagus untuk ini. Lihatlah 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;
}
Di sini kita melihat bahwa jika Anda menetapkan qty_correction
nilai, itu akan menerapkan perbedaan secara bertahap alih-alih menerapkan jumlah yang tepat.
Jadi saran saya untuk menghemat qty lebih aman adalah ini:
/**
* @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
}