Search code examples
magento

Magento product load - difference between loadByAttribute and load methods


today I'm fighting with Magento again :) and I found a difference between

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $product_sku);

and

$product = Mage::getModel('catalog/product')->load($product_id);

Can anyone exaplain me a difference between these two approaches? I found that when I'm loading a product by sku then when I 'try to re-save it with changed data then I get error exception 'Varien_Exception' with message 'Invalid method Varien_Object::save in app\code\core\Mage\CatalogInventory\Model\Observer.php(153): Varien_Object->__call('save', Array) that's true because once you try to load by sku then another observer sets product's stock item as Varien_Object, that looks like pitfall or I just dont understand it enough, but

I do daily Magento development from its beginnig so I know a lot about system and this is new for me. Thanks in advance, Jaro.


Solution

  • Interesting. While both methods will net you a single product model instance with fully loaded EAV data (provided the third parameter of loadByAttribute() is not passed or is *), the observers which add stock-related data are different for products vs. product collections, yet both stock information objects are added to the product data key "stock_item". It's debatable, but this feels like a bug. I would think that Mage_CatalogInventory_Model_Observer::saveInventoryData() or Mage_CatalogInventory_Model_Observer::_prepareItemForSave() would handle this.

    You could resolve this issue by setting the product stock item fully on your product instance using the stock_item object.