产品列表属性过滤器查询


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)AND cat_index.category_id = '3' WHERE( etype_idIN( '简单'的))AND(e.website_id ='1')AND(e.customer_group_id = 0)AND(e.min_price不为空)GROUP BY FLOOR((ROUND((e.min_price)* 1,2))/ 10) + 1按楼层排序((ROUND((e.min_price)* 1,2))/ 10)+ 1 ASC


您使用了哪个magento版本?*&已应用magento补丁
Amit Bera

1
wtf?现在有道理...我正在RWD上尝试EE 1.14,这是不可接受的,视图主题如何更改整个查询,甚至更糟的是如何更改主表...这也只能是一个错误。@Magento学习者做得好!
MauroNigrele

确实,视图主题会产生问题。谢谢。代码应独立于主题
Magento Learner

Answers:


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中,他们对用于价格过滤选项的选择sql进行了优化。他们删除了FROM sql部分(这是产品实体-包含type_id属性),并使price_index相关表成为主要的-一个因此,基本上,从中选择数据的表不再是产品实体表(您丢失了所有产品基本属性),主表成为了产品索引。这是一个核心更新, Magento团队添加了1.7版开始。” 请参阅以下内容
Magento Learner


1
出于某些原因,向我的缺点求助者,我在考虑后端块的getCollection方法,因此在这种情况下,您的第一个代码是可以的,我不确定这是否是最佳解决方案,但似乎还可以。抱歉
MauroNigrele 2015年

@MagentoLearner您确定该帖子吗?我刚刚在EE1.14上进行了重新检查,我已经安装并且仍然使用catalog_product_entity作为主表,除非您设置为使用平面目录(绝对推荐),但是在两种情况下,您的选择中都存在type_id。您可以像我在原始答案中所写的那样记录查询吗?
MauroNigrele 2015年

1
mmmm有趣的...我也在搜索用例中检查查询,并使用catalog_product_entity作为主表,也许“ magento团队”已决定回滚该更改。我找不到任何安装的1.7来检查它,但是更改实体主表的想法听起来像是一个非常糟糕的体系结构决定...请注意,您刚刚毁了我的周末,现在我需要找到并安装CE1 .7并用我自己的眼睛看这胡扯...我的妻子对此不满意:)
MauroNigrele 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.