제품 목록 속성 필터 쿼리


12

다음과 같이 _getProductCollection() 클래스의 메소드 에 하나의 필터를 추가했습니다 Mage_Catalog_Block_Product_List.

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection->getSelect()->joinInner(
        array('cpe' => 'catalog_product_entity'),
        'e.entity_id = cpe.entity_id'
    ) 
    ->where("cpe.type_id = 'simple'"); 
    ...
}

위의 코드는 Magento 버전 1.7부터 제대로 작동합니다. 그러나 다음 코드를 작성할 때마다

열을 찾을 수 없음 : 1054 'where 절'에서 알 수없는 열 'e.type_id'

오류.

작동하지 않는 코드입니다.

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection
        ->addAttributeToSelect('type_id')
        ->addAttributeToFilter('type_id','simple');
    ...
}

이제 질문 .

  1. 첫 번째 작업 코드를 사용하면 성능에 영향이 있습니까?
  2. 적절한 제품 필터를 갖기 위해 다른 방법이 있습니까?

최신 정보:

다음 코드를 적용하고 rwd테마를 사용할 때마다 오류가 발생하지 않습니다. 그러나 사용자 default테마를 사용할 때마다 아래 오류가 발생합니다.

암호

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection
         ->addAttributeToSelect('type_id')
         ->addAttributeToFilter('type_id','simple');
    ...
}

오류

SQLSTATE [42S22] : 열을 찾을 수 없음 : 1054 'where 절'에서 알 수없는 열 'e.type_id', 쿼리는 다음과 같습니다. SELECT FLOOR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 AS range, COUNT (*) AS countFROM catalog_product_index_priceAS e INNER JOIN catalog_category_product_indexAS cat_indexON cat_index.product_id = e.entity_id AND cat_index.store_id = 1 AND cat_index.visibility의 IN (2, 4) = cat_index.category_id '3'WHERE ( e. type_idIN ( '단순한' )) AND (e.website_id = '1') AND (e.customer_group_id = 0) AND (e.min_price가 NULL이 아님) GROUP BY FLOOR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 ORDER BY FLOOR ((라운드 ((e.min_price) * 1, 2)) / 10) + 1 ASC


어떤 마 젠토 버전 u를 사용합니까 ?? * & magento 패치를 적용했습니다
Amit Bera

1
wtf? 이제 이해가되었습니다 ... RWD에서 EE 1.14 이상을 시도했지만 허용되지 않습니다.보기 테마가 어떻게 전체 쿼리를 변경하여 최악의 기본 테이블을 변경할 수 있습니까? 이것은 버그 일뿐입니다 . @Magento Learner를 끝냈습니다!
MauroNigrele

정확히보기 테마는 문제를 일으 킵니다. 감사. 코드는 테마와 무관해야합니다
Magento Learner

답변:


0

내 생각에는:

$collection->addAttributeToFilter('type_id', array('eq' => 'simple');

작동해야 하므로 열 이기 때문에 추가 type_id할 필요가 없으며 기본적으로 열을 검색합니다. 나는 항상 무슨 일이 일어나고 있는지 알기 위해 최종 쿼리를 기록하는 것이 좋습니다.selectcatalog_product_entity

Mage.:log($collection->getSelectSql(true));

BTW : 첫 번째 코드 블록은 기본 테이블 ( catalog_product_entity) 을 자체에 조인하기 때문에 전혀 의미가 없습니다 .


"Magento 1.7에서는 가격 필터링 옵션에 사용되는 select sql에 대해 최적화를 수행했습니다. FROM sql 부분 (제품 엔터티-type_id 속성 포함)을 제거하고 price_index 관련 테이블을 기본 테이블로 만듭니다. 기본적으로 데이터가 선택되는 테이블은 더 이상 제품 엔터티 테이블이 아니며 (모든 제품 기본 특성이 손실 됨) 기본 테이블은 제품 인덱스가됩니다. Magento 팀은 1.7 버전부터 추가했습니다. " 다음을 참조하십시오
Magento Learner


1
어떤 이유로 든 백엔드 블록 getCollection 메소드에서 생각하고 있었 으므로이 시나리오에서 첫 번째 코드는 괜찮습니다. 최고의 솔루션인지 확실하지 않지만 괜찮습니다. 죄송합니다
MauroNigrele

@MagentoLearner 해당 게시물에 대해 확신하십니까? 방금 EE1.14를 다시 확인했습니다. 플랫 카탈로그를 사용하도록 설정 한 경우 (절대 권장)를 제외하고 catalog_product_entity를 기본 테이블로 설치하고 계속 사용하고 있지만 두 경우 모두 select_id가 select에 있습니다. 원래 답변에 작성한대로 쿼리를 기록 할 수 있습니까?
MauroNigrele

1
mmmm 흥미 ... i 또한 검색 사례에서 쿼리를 확인하고 catalog_product_entity를 기본 테이블로 사용하고있을 수 있습니다. "magento 팀"이 해당 변경 사항을 롤백하기로 결정했을 수 있습니다. 1.7을 확인하여 설치할 수는 없지만 엔터티의 기본 테이블을 변경한다는 아이디어는 매우 나쁜 건축 결정처럼 들립니다 ... 방금 주말을 망쳤습니다. 이제 CE1을 찾아서 설치해야합니다. .7 그리고 내 자신의 눈 으로이 쓰레기를보십시오 ... 내 아내는 이것으로 만족하지 않을 것입니다 :)
MauroNigrele
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.