究其原因ColinM的答案的工作原理是由于代码app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
的addAttributeToFilter
方法。如果您使用此数组格式,则不会调用addAttributeToSelect
。在平面模式下,addAttributeToSelect
如果属性不在平面表中,则静默失败。
(以下是我在/programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620上的答案的哈希值-我是不知道这是什么礼节,但知道我会发现这很有帮助)
我想要一个“干净”的解决方案,用于平面模式集合选择和过滤非平面属性,该解决方案:
- 不需要该属性在admin中具有特定设置(它可以由用户添加或隐藏在前端)
- 适用于平面和非平面模式
我使用了相关的产品集合,但这适用于任何EAV集合。
失败的代码:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
在平面模式下,如果上面的代码碰巧不在平面表中,则上述代码将无提示地对属性进行选择或过滤。
添加到选择:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->joinAttribute( 'my_custom_attribute', 'catalog_product/my_custom_attribute', 'entity_id', null, 'left' )
->addAttributeToSelect( 'my_custom_attribute' )
;
该joinAttribute
方法向查询中添加了针对所请求的特定属性的联接。当属性已经在平面表中时,它仍然可以工作,但是效率将比单纯使用平面表时稍低。
我在left
此处使用了联接,以确保如果my_custom_attribute
未在那些产品上设置产品,则可以获取这些产品。inner
如果只对my_custom_attribute
设置位置的行感兴趣,请更改此设置。
添加到过滤器中(根据上述ColinM):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
上面的代码会将其添加到选择内容中,并遵循您的过滤条件。
(在CE 1.6.2.0中测试)
non-flat attribute
?谢谢。不要让magento令人困惑。它已经令人困惑