从已加载的Magento模型中检索其他数据
有时,我会收到一个模型,其中只包含我需要的一些数据,例如从已加载的Magento模型中检索其他数据,magento,Magento,有时,我会收到一个模型,其中只包含我需要的一些数据,例如目录/产品实例,其中不包含我可能需要使用的某些属性,例如尺寸、小部件编号或腰围测量 为了缓解这种情况,我目前的选择是: 创建一个新块,并使用addAttributeToSelect($name)手动加载所需的属性 使用当前未充分填充的模型的ID加载模板中的整个模型,例如,Mage::getModel('catalog/product')->>getId($product->getId()) 对于我的问题:在调用了->load()之后,是
目录/产品
实例,其中不包含我可能需要使用的某些属性,例如尺寸、小部件编号或腰围测量
为了缓解这种情况,我目前的选择是:
- 创建一个新块,并使用
手动加载所需的属性addAttributeToSelect($name)
- 使用当前未充分填充的模型的ID加载模板中的整个模型,例如,
Mage::getModel('catalog/product')->>getId($product->getId())
对于我的问题:在调用了
->load()
之后,是否有一种方法可以选择要在模型集合中加载的其他属性?另外,是否有一种方法可以在单个型号上执行此操作?本节讨论了正确和最安全的方法(但不是最佳方法,请参见下文),即再次加载产品
由于以下几个原因,在产品加载后,还没有开发出添加更多属性的方法:
1) 在模型的生命周期中,它的很多值都被计算并缓存在模型中。因此,添加更多属性(例如price)将改变模型的状态,但不会影响几个方法的结果,这些方法旨在返回这些属性值(例如getPrice()),但在内部执行一些额外的预处理,并依赖于以前计算的数据
2) 模型的状态将不一致,因为一些方法将返回缓存的和当前无效的值,这些值是根据前一个空属性计算的,而其他一些方法将返回非缓存的值。因此,这种模型的使用将是不安全的,其属性将是不可预测的
3) 支持这种重新加载的代码的复杂性相当大
解决方案
1) 第一个好的解决方案(尽管是最重的解决方案)是在块/模型/辅助对象每次需要扩展属性集时再次加载产品
2) 更好的解决方案是,只要您看到这些属性是必需的,而原始集合中没有这些属性,就用所有具有所有附加属性的产品加载新集合
3) 最好的解决方案是加载具有所有必需属性的原始产品集合。有时,集合确实会加载具有可能属性子集的产品-主要是EAV优化的遗留代码(现在默认情况下,平面表处于“打开”状态,不需要进行此优化),或者可能是当集合由搜索引擎加载时(例如,Magento EE中的Solr),默认情况下,不会将所有属性存储在其记录中
3.1)您可以将所需的属性添加到原始集合的实例化位置-通过问题中提到的addAttributeToSelect($attributeNames)
方法
3.2)您可以将属性添加到属性列表中,并自动填充到集合中。属性列表因模块而异,并且存储在不同的位置。有些在配置中,有些在数据库中。具体位置(配置或数据库表),为自动填充添加属性的位置,取决于具体情况
4) 有时,当您只需要属性值时,编写资源模型可能会更容易、更快,它将通过
productIds
和currentstoreId
范围直接从DB加载它们。然后,您可以冒险将它们设置为集合中产品的属性,或者安全地将它们设置为产品的MyAdditionalAttributesValuesArray
属性,或者作为独立数组使用,映射到产品ID。您是否尝试过Ivan在这个问题中建议的反射技术?或者可能是Varien_Data_集合的setDataToAll方法?当我得到一个缺少数据的产品时,它通常位于一个类别页面上,其中一些属性被故意排除。为了避免这种情况,请从admin编辑属性,并将其“用于产品列表”更改为“是”。@clockworkgeek:这是一种通用解决方案吗?如中所述,属性选项“用于产品列表”是否标记错误,并标记为“是”是否将其添加到集合的默认属性选择列表?确定该选项仅影响类别页面和“产品列表”块。购物车似乎有自己的关于构建属性的规则。这只是部分解决办法。