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


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' в 'предложении where', запрос: SELECT FLOOR ((ROUND ((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В ( 'простой' )) AND (e.website_id = '1') AND (e.customer_group_id = 0) AND (e.min_price IS NULL) ГРУППА ПО ЭТАЖУ ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 ЗАКАЗ ПО ЭТАЖУ ((КРУГЛЫЙ ((e.min_price) * 1, 2)) / 10) + 1 ASC


какую версию magento вы используете ?? * и применили патчи 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));

Кстати: первый блок кода не имеет никакого смысла, поскольку вы присоединяете основную таблицу ( catalog_product_entity) к себе.


«в Magento 1.7 была проведена оптимизация для select sql, который используется для параметров фильтрации цен. Они удаляют часть FROM sql (которая является сущностью продукта - которая содержит атрибут type_id) и делают связанную таблицу price_index главной - той, которая который используется в части запроса FROM, поэтому в основном таблица, из которой выбираются данные, больше не является таблицей сущностей продуктов (вы теряете все атрибуты базы продуктов), главная таблица становится индексом продукта. Это основное обновление, которое команда Magento добавила начиная с версии 1.7 " См. Следующее
Ученик Magento


1
По какой-то причине, по моей вине, я подумал о методе getCollection в бэкэнд-блоке, так что в этом сценарии ваш первый код в порядке, я не уверен, что это лучшее решение, но кажется, что все в порядке. Извините
MauroNigrele

@MagentoLearner ты уверен в этом посте? Я только что повторно проверил EE1.14, который я установил и все еще использую catalog_product_entity в качестве основной таблицы, за исключением случаев, когда вы используете плоский каталог (абсолютно рекомендуется), но в обоих случаях у вас есть type_id, присутствующий в select. Можете ли вы войти в запрос, как я написал в оригинальном ответе?
MauroNigrele

1
мммм интересно ... я также проверил запрос в поисковом случае и использует catalog_product_entity в качестве основной таблицы, возможно, «команда magento» решила откатить эти изменения. Я не могу найти ни одного установленного 1.7, чтобы проверить это, но идея изменить основную таблицу сущности звучит как очень плохое архитектурное решение ... Хорошо, обратите внимание, что вы только что испортили мои выходные, теперь мне нужно найти и установить CE1 .7 и посмотри на эту чушь своими глазами ... моя жена не будет счастлива с этим :)
MauroNigrele
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.