【问题标题】:Magento product load - difference between loadByAttribute and load methodsMagento 产品加载 - loadByAttribute 和加载方法之间的区别
【发布时间】:2012-06-11 08:59:39
【问题描述】:

今天我又和 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 开发,所以我对系统了解很多,这对我来说是新的。在此先感谢 Jaro。

【问题讨论】:

  • 哇谢谢有同样的问题,现在通过 sku 加载它,然后通过 id 加载它
  • 谢谢。第一种方法对我有用,我相信第二种方法不接受变量?当我硬编码一个 SKU 编号时,它确实有效。

标签: magento


【解决方案1】:

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

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

【讨论】:

  • 它看起来像一种错误,你创建一个集合,你有带有伪造库存信息的产品,一旦你想改变它就会失败。我花了 3 天时间才弄清楚这一点,因为它发生在核心深处,你不会怀疑和期待。我需要与其他人分享这些信息,以节省他们的时间和生命:)
  • 好像在1.8还是会发生?我今天遇到了这个问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多