14

今天我又和 Magento 打架了 :) 我发现了两者之间的区别

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

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

谁能解释一下这两种方法之间的区别?我发现,当我通过 sku 加载产品时,当我尝试使用更改的数据重新保存它时,我收到错误异常 'Varien_Exception' 并显示消息 'Invalid method Varien_Object::save in app\code\core\Mage \CatalogInventory\Model\Observer.php(153): Varien_Object->__call('save', Array) 这是真的,因为一旦您尝试按 sku 加载,然后另一个观察者将产品的库存项目设置为 Varien_Object,这看起来像陷阱或者我只是不够了解,但是

我从一开始就每天进行 Magento 开发,所以我对系统了解很多,这对我来说是新的。在此先感谢,雅罗。

4

2 回答 2

17

有趣的。虽然这两种方法都会为您提供一个带有完全加载的 EAV 数据的单个产品模型实例(前提loadByAttribute()是未传递或 is的第三个参数*),但添加库存相关数据的观察者对于产品与产品集合是不同的,但两者都是库存信息对象被添加到产品数据键“stock_item”。这是有争议的,但这感觉就像一个错误。我会认为Mage_CatalogInventory_Model_Observer::saveInventoryData()Mage_CatalogInventory_Model_Observer::_prepareItemForSave()会处理这个。

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

于 2012-06-07T15:01:38.297 回答
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

于 2020-07-24T23:25:27.120 回答