Запит списку фільтрів атрибутів списку продуктів


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 Невідомий стовпець "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 Невідомий стовпець 'e.type_id' у «де пункт», запит: SELECT FLOOR ((КРУГЛО ((e.min_price) * 1, 2)) / 10) + 1 AS range, COUNT (*) ЯК countВІД catalog_product_index_priceAS e INNER JOIN catalog_category_product_indexЯК cat_indexПО cat_index.product_id = e.entity_id і cat_index.store_id = 1 і cat_index.visibility В (2, 4) і cat_index.category_id = '3' WHERE ( e. type_idВ ( 'простий' )) І (напр., Веб-сайт_id = '1') І (наприклад, користувацька_група_id = 0) І (напр. Ціна НЕ НУЛЬНА) ГРУПА ПО ПЛАТЕ ((КРУГЛО ((e.min_price) * 1, 2)) / 10) + 1 ЗАМОВЛЕННЯ ПОЛУ ((КРУГЛО ((напр. Ціна) * 1, 2)) / 10) + 1 ASC


яку версію magento у вас використовують ?? * і застосували патчі
магенто

1
wtf? тепер має сенс ... я пробував EE 1.14 на RWD, це просто неприпустимо, як тема перегляду може змінити весь запит, навіть найгірше, як можна змінити основну таблицю ... це не могло бути нічого, крім помилки . Молодці @Magento Learner!
MauroNigrele

Саме тема перегляду створює проблему. Дякую. Код повинен бути незалежним від теми
Magento Learner

Відповіді:


0

Я думаю що:

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

Повинен чи працює, вам не потрібно додавати type_idдо selectтак це catalog_product_entityстовпець і він витягується за замовчуванням. Я завжди пропоную записати підсумковий запит, щоб отримати найкраще уявлення про те, що відбувається:

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

BTW: Перший блок коду взагалі не має сенсу, оскільки ви приєднуєте головну таблицю ( catalog_product_entity) до себе.


"в Magento 1.7 вони зробили оптимізацію для вибору sql, який використовується для параметрів фільтрації цін. Вони видаляють частину FROM sql (яка є об'єктом продукту - яка містить атрибут type_id) і роблять таблицю, пов'язану з Price_index, головною - однією що використовується в частині запиту. Отже, в основному таблиця, з якої вибрані дані, більше не є таблицею сутності продукту (ви втрачаєте всі базові атрибути продуктів), головна таблиця стає індексом продукту. Це основне оновлення, яке Команда Magento додала стартових 1.7 версій. " Перегляньте наступне
Magento Learner


1
Уооу, моя віна, я чомусь думав у методі getCollection за допомогою резервного блоку, тому в цьому сценарії ваш перший код це нормально, я не впевнений, чи це найкраще рішення, але здається, що це нормально. Вибачте
MauroNigrele

@MagentoLearner Ви впевнені в цій публікації? Я щойно перевірив на EE1.14, я встановив і досі використовую каталог_product_entity в якості основної таблиці, за винятком випадків, коли ви встановили використовувати плоский каталог (абсолютно рекомендується), але в обох випадках у виборі присутній type_id. Чи можете ви записати запит, як я написав в оригінальній відповіді?
MauroNigrele

1
мммм цікаво ... Я також перевіряю запит у пошуковій справі і використовую каталог_продукт_entity як основну таблицю, можливо, "команда magento" вирішила відкатати ці зміни. Я не можу знайти жодного встановленого 1.7, щоб перевірити це, але думка змінити основну таблицю суті звучить як дуже погане архітектурне рішення ... Ну зауважте, що ви щойно зруйнували мої вихідні, тепер мені потрібно знайти та встановити CE1 .7 і дивіться це лайно своїми очима ... моя дружина не буде задоволена цим :)
MauroNigrele
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.