从已加载的Magento模型中检索其他数据

时间:2011-06-26 12:23:48

标签: magento

在某些情况下,我交给的模型只包含我需要的一些数据,例如catalog/product个实例不包含我可能需要使用的某些属性,例如大小,小部件数量,或腰围测量。

为了缓解这种情况,我目前的选择是:

  • 创建一个新块,并使用addAttributeToSelect($name)手动加载所需的属性。
  • 使用当前未充分填充的模型中的ID加载模板中的整个模型,例如Mage::getModel('catalog/product')->getId($product->getId())

对于我的问题:有没有办法可以在调用->load()之后选择我想在模型集合中加载的其他属性?另外,有没有一种方法可以在单个模型上执行此操作?

1 个答案:

答案 0 :(得分:5)

正确地描述了正确且最安全的方法(但不是最好的方法 - 见下文) - 它是再次加载产品。

在加载产品后,尚未开发出添加更多属性的方法,原因如下:

1)在模型生命周期中,很多其值都会在模型中计算和缓存。因此,添加更多属性(例如价格)将改变模型的状态,但不会影响几种方法的结果,这些方法旨在返回这些属性值(例如getPrice()),但在内部进行一些额外的预处理并依赖于先前计算的数据

2)模型的状态将不一致,因为某些方法将返回缓存且当前无效的值,在先前的空属性上计算,而其他一些方法将返回非缓存值。因此,使用此类模型将是不安全的,其属性将无法预测。

3)支持此类重新加载的代码的复杂性非常大。

<强>解决方案

1)第一个好的解决方案(虽然是最重的解决方案)是每次你的块/模型/帮助器需要扩展的属性集时再次加载产品。

2)更好的解决方案 - 加载所有具有所有附加属性的产品的新集合,无论何时,只要您看到,这些属性都是必需的,而原始集合不具备这些属性。

3)最佳解决方案 - 加载具有所有必需属性的原始产品集合。有时集合实际上会加载具有可能属性子集的产品 - 主要是它是EAV优化的遗留代码(现在平面表默认为'on'并且不需要此优化),或者可能是搜索引擎加载集合时(例如Solr)在Magento EE中,默认情况下,它不会将所有属性存储在其记录中。

3.1)您可以在原始集合中将所需属性添加到实例化的地方 - 通过提及问题addAttributeToSelect($attributeNames)方法

3.2)您可以将属性添加到属性列表中,自动填充在集合中。属性列表因模块而异,它们存储在不同的位置。有些是在配置中,有些是在数据库中。具体位置(配置或数据库表),添加自动填充属性的位置取决于具体情况。

4)有时,当您只需要属性值时,编写资源模型可能会更加容易和快捷,它将直接从productIds和当前storeId范围从数据库加载它们。然后,您可以冒险将其设置为集合中产品的属性,或者将它们安全地设置为Products myAdditionalAttribuesValuesArray属性,或者将其用作独立数组,映射到产品ID。