I've got this code below to retrieve and update 1 of the SKU of my Magento product.
It's updated and looks alright when I view on the code $product->getQty();
But when I look into Magento, the qty was not updated....
Could you please let me know where did I go wrong?
<?php
define('MAGENTO_ROOT', dirname(__FILE__));
$mageFilename = MAGENTO_ROOT . '/app/Mage.php';
require_once $mageFilename;
Varien_Profiler::enable();
ini_set('display_errors', 1);
umask(0);
Mage::app();
//get the collection filter the simple products & join the cataloginventory/stock_item table
$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('sku')->addAttributeToFilter('type_id', 'simple')->joinField(
'qty',
'cataloginventory/stock_item',
'qty',
'product_id=entity_id',
'{{table}}.stock_id=1',
'left'
) ;
?>
<html>
<head></head>
<body>
<table>
<?php
foreach ($collection as $product) {
if ($product->getSku() == "test123") {
try
{
$product->setData('qty', 99);
$product->save();
}
catch (Exception $e)
{
echo $e->getMessage();
}
}
echo "<tr><td>".$product->getSku()."</td><td> ".(int)$product->getQty()."</td></tr>";
};
?>
The qty field isn't an attribute of the product model, it's only present because you're left-joining the stock_item table onto it. To update a quantity you need to update the instance of the stock_item model and save that. There's a handy helper function which lets you load a stock_item by a product ID.
$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($myProductId);
if ($stockItem->getId()) {
$stockItem->setQty($qty);
$stockItem->save();
}
The reason your getQty output worked correctly afterwards is because the Model is a Varien_Object and therefore has the magic getter/setters which lets you save a variable called "Qty" on the model and retrieve it again later. However, having a variable on the model doesn't mean it will be attached to that database entry, only the attributes that are connected to the product entity will be saved when you call save().