Lista produktów Atrybut Filtr Zapytanie

12

Dodałem jeden filtr do metody _getProductCollection() klasy Mage_Catalog_Block_Product_List w następujący sposób.

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'"); 
    ...
}

Powyższy kod działa poprawnie od wersji 1.7 Magento. Ale ilekroć piszę następujący kod, daje

Nie znaleziono kolumny: 1054 Nieznana kolumna „e.type_id” w „klauzula gdzie”

błąd.

Kod (który nie działa).

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

Teraz pytania .

  1. Czy jeśli użyję pierwszego działającego kodu, będzie to miało wpływ na wydajność?
  2. czy jest jakiś inny sposób na obejście odpowiedniego filtra produktu?

AKTUALIZACJA:

Ilekroć zastosuję następujący kod i użyję rwdmotywu, nie pojawia się żaden błąd. Ale gdy używam defaultmotywu użytkownika , pojawia się następujący błąd,

Kod

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

Błąd

SQLSTATE [42S22]: Nie znaleziono kolumny: 1054 Nieznana kolumna „e.type_id” w „klauzula gdzie”, zapytanie brzmiało: SELECT FLOOR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 AS range, COUNT (*) jako countOD catalog_product_index_priceAS e INNER Dołącz catalog_category_product_indexCO cat_indexON cat_index.product_id = e.entity_id I cat_index.store_id = 1 cat_index.visibility IN (2, 4) i cat_index.category_id = '3' GDZIE ( e. type_idW ( 'proste' )) AND (e.website_id = '1') AND (e.customer_group_id = 0) AND (e.min_price IS NOT NULL) GROUP BY FLOOR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 ZAMÓWIENIE WEDŁUG PODŁOGI ((OKRĄGŁY ((cena emin.) * 1, 2)) / 10) + 1 ASC

Uczeń Magento
źródło
z jakiej wersji magento korzystasz? * i zastosowałem łatki Magento
Amit Bera
1
wtf? teraz ma sens ... próbowałem EE 1.14 na RWD, co jest po prostu niedopuszczalne, jak motyw widoku może zmienić całe zapytanie nawet najgorsze, jak zmienić główną tabelę ... to nie może być nic innego jak błąd . Dobra robota @Magento Learner!
MauroNigrele,
Dokładnie temat widoku tworzy problem. dzięki. Kod powinien być niezależny od tematu
Magento Learner

Odpowiedzi:

0

Myślę, że:

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

Powinno działać, nie musisz dodawać type_iddo, selectponieważ jest to catalog_product_entitykolumna i jest ona domyślnie pobierana. Zawsze sugeruję, aby zapisać ostatnie zapytanie, aby uzyskać najlepszy obraz tego, co się dzieje:

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

BTW: Pierwszy blok kodu nie ma żadnego sensu, ponieważ dołączasz do głównej tabeli ( catalog_product_entity) do siebie.

MauroNigrele
źródło
„w Magento 1.7 dokonali optymalizacji wybranego sql używanego do opcji filtrowania cen. Usuwają część sql (która jest jednostką produktu - która zawiera atrybut type_id) i ustawiają tabelę związaną z price_index jako główną - tę jedną która jest używana w części zapytania FROM. Więc w zasadzie tabela, z której wybierane są dane, nie jest już tabelą encji produktu (tracisz wszystkie atrybuty podstawowe produktów), tabela główna staje się indeksem produktu. Jest to podstawowa aktualizacja, która zespół Magento dodał początkowe wersje 1.7 ”. Zobacz następujące informacje
Magento Learner
1
wow, moja wina, ludu, z jakiegoś powodu zastanawiałem się nad metodą getCollection w bloku zaplecza, więc w tym scenariuszu twój pierwszy kod jest w porządku Nie jestem pewien, czy jest to najlepsze rozwiązanie, ale wydaje się być w porządku. Przepraszamy
MauroNigrele,
@MagentoLearner czy jesteś pewien tego postu? Właśnie sprawdziłem ponownie na EE1.14. Zainstalowałem i nadal używam catalog_product_entity jako głównej tabeli, z wyjątkiem sytuacji, gdy ustawiłeś używanie płaskiego katalogu (absolutnie zalecane), ale w obu przypadkach masz typ_id obecny w zaznaczeniu. Czy możesz zalogować zapytanie, tak jak napisałem w oryginalnej odpowiedzi?
MauroNigrele,
1
mmmm ciekawe ... i Sprawdź także zapytanie w przypadku wyszukiwania i używa katalogu_product_entity jako głównej tabeli, być może „zespół magento” postanowił wycofać te zmiany. Nie mogłem znaleźć zainstalowanego 1.7, by to sprawdzić, ale pomysł zmiany głównej tabeli bytu brzmi jak bardzo zła decyzja architektoniczna ... Pamiętaj, że właśnie zepsułeś mój weekend, teraz muszę znaleźć i zainstalować CE1 .7 i spójrz na to gówno na własne oczy ... moja żona nie będzie z tego zadowolona :)
MauroNigrele