製品リスト属性フィルタークエリ


12

_getProductCollection() クラスのメソッドにMage_Catalog_Block_Product_List 次のようにフィルターを1つ追加しました。

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不明な列 'e.type_id'が 'where句'にあり、クエリは次のとおりです:SELECT FLOOR((ROUND((e.min_price)* 1、2))/ 10)+ 1 AS range、 AS COUNT(*)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'( etype_idIN( 'シンプル'を))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 ORDER BY FLOOR((ROUND((e.min_price)* 1、2))/ 10)+ 1 ASC


どのmagentoバージョンを使用していますか?*&magentoパッチを適用済み
Amit Bera

1
wtf?今は理にかなっています...私はRWDでEE 1.14を試してみました、それはちょうど受け入れられません、どのようにしてビューテーマがクエリ全体を変更することができ、最悪の場合メインテーブルを変更することができます...これはバグでしかありませんでした。@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を最適化しました。FROMsql部分(製品エンティティ-type_id属性を含む)を削除し、price_index関連テーブルをメインの-1つにしますこれはクエリのFROM部分で使用されます。したがって、基本的に、データが選択されるテーブルは製品エンティティテーブルではなくなります(すべての製品の基本属性が失われます)。メインテーブルは製品インデックスになります。これはコアアップデートです。 Magentoチームは1.7バージョンから追加しました。」以下を参照してください
Magento Learner


1
なんとか私の障害者は、バックエンドブロックのgetCollectionメソッドで考えていたので、このシナリオでは最初のコードは問題ありません。それが最善の解決策かどうかはわかりませんが、問題がないようです。申し訳ありません
MauroNigrele

@MagentoLearnerその投稿について確信がありますか?EE1.14を再確認しました。フラットテーブルを使用するように設定した場合(絶対にお勧めします)を除き、カタログにproduct_entityをインストールして使用していますが、どちらの場合もselectにtype_idが含まれています。元の回答に書いたとおりにクエリを記録できますか?
MauroNigrele

1
おもしろい... i検索ケースでクエリをチェックし、catalog_product_entityをメインテーブルとして使用している場合、「magentoチーム」がその変更をロールバックすることを決定した可能性があります。チェックする1.7がインストールされていませんが、エンティティのメインテーブルを変更するという考えは非常に悪いアーキテクチャの決定のように聞こえます...さて、私の週末を台無しにしたことに注意してください。 .7そして、このがらくたを自分の目で見てください...私の妻はこれに満足しません:)
MauroNigrele
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.