Magento产品负载 - loadByAttribute和load方法之间的差异

时间:2012-06-07 09:57:32

标签: magento

今天我再次与Magento战斗:)我找到了

之间的区别
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $product_sku);

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

任何人都可以在这两种方法之间取得进展吗?我发现当我通过sku加载产品时,当我尝试用更改的数据重新保存它时,我得到错误异常'Varien_Exception',消息'无效方法Varien_Object ::保存在app \ code \ core \ Mage \ CatalogInventory \ Model \ Observer.php(153):Varien_Object-> __ call('save',Array)这是真的,因为一旦你尝试通过sku加载,那么另一个观察者将产品的库存项目设置为Varien_Object,这看起来像陷阱或我只是不明白它,但

我每天从它的开始做Magento开发,所以我对系统了解很多,这对我来说是新的。在此先感谢Jaro。

2 个答案:

答案 0 :(得分:17)

有趣。虽然这两种方法都会为您提供一个具有满载EAV数据的单个产品模型实例(如果loadByAttribute()的第三个参数未通过或者是*),则添加库存相关数据的观察者会因此而异。产品与产品集合,但两个库存信息对象都添加到产品数据键“stock_item”。这是有争议的,但这感觉就像一个错误。我认为Mage_CatalogInventory_Model_Observer::saveInventoryData()Mage_CatalogInventory_Model_Observer::_prepareItemForSave()可以解决此问题。

您可以使用stock_item对象在产品实例上完全设置产品库存项来解决此问题。

答案 1 :(得分:1)

我认为

loadByAttribute是一个严重的误称,因为它实际上不会触发load();而是使用getResourceCollection()

public function loadByAttribute($attribute, $value, $additionalAttributes = '*')
{
    $collection = $this->getResourceCollection()
        ->addAttributeToSelect($additionalAttributes)
        ->addAttributeToFilter($attribute, $value)
        ->setPage(1,1);

因为它不会触发与load()关联的观察者事件,所以它意味着结果产品对象不包含您可能需要的全部产品数据。就我而言,我需要“描述”属性,但不包含该属性。

有几种解决方法:

  • 使用其他方法通过SKU加载:

      $product = Mage::getModel("catalog/product");
      $product->load($product->getIdBySku("whatever"));
    
  • 通过访问Magento Admin > Catalog > Attributes > Edit attribute > "Used in Product Listing" = "Yes",然后重新编制索引,将所需的属性数据强制包含在默认产品资源数据中。然后,您应该能够使用loadByAttribute()使用属性数据(至少在前端)。

另请参阅https://magento.stackexchange.com/a/197286/18855