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
?ありがとう。