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에 대한 답변의 해시입니다. - 난 에티켓이 무엇인지 잘 모르겠지만 도움이 될 것입니다.)
플랫 모드가 아닌 속성에서 플랫 모드 컬렉션을 선택하고 필터링하기위한 "깨끗한"솔루션이 필요했습니다.
- 속성에 관리자의 특정 설정이 필요하지 않습니다 (사용자가 추가하거나 프런트 엔드에서 숨길 수 있음)
- 플랫 모드와 비 플랫 모드 모두에서 작동
관련 제품 컬렉션을 사용했지만 모든 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를 혼동하지 마십시오. 이미 혼란스러워