0

OK、かなり単純なモジュールを実行していますが、解決できない製品コレクションの問題に遭遇しました。問題は次のとおりです。

1) 投稿された検索カテゴリに基づいて製品コレクションをロードします。

$products = Mage::getModel('catalog/product')
            ->getCollection()
            ->addStoreFilter(Mage::app()->getStore()->getId())
            ->addAttributeToSelect('*')
            ->addAttributeToFilter('search_category', array('eq' => $data['search_category'])); 

2) このコレクションを基本関数で使用して、属性を取得します。

$section = $this->getSections($products);

3) 次のコードでは、別の値が投稿された場​​合に製品コレクションをさらに絞り込み、別の関数を実行します。

if($data['section'] != "")
{
    $products->addAttributeToFilter('section', array('eq' => $data['section']));            
    $profile = $this->getProfiles($products);
    echo count($products);
    echo count($products->getIds());
}

基本的に、2 番目の機能に入る製品はフィルタリングされません。この段階で $products オブジェクトのカウントをエコーすると、フィルタリングされた金額ではなく、製品コレクションの元の金額が返されます。

$products->getIds() をエコーすると、正しいフィルタリングされたカウントが得られます。

なぜこれが機能しないのか本当に理解できません。コードを詳細にチェックしたところ、すべて正しいです。関数で製品コレクションを使用すると、それ以上フィルタリングできないようです。

フィルターを最初の関数の上に移動すると機能しますが、明らかに望ましい結果が得られます。

誰かがこれを説明できる場合は助けてください!

4

1 に答える 1

5

$productsコレクションが初期化と追加のフィルタを追加しようとしている場所の間のどこかにロードされているかどうかを確認する必要があります。

コレクションがロードされた後は、DB からコレクションを取得するための最終リクエストにのみ影響し、あなたのコレクションは既にロードされているため、それに適用するフィルタは影響しません。

(言及Mage_Catalog_Model_Resource_Product_Collection::getAllIds()のスペルを間違えたと思います)は、コレクション内のSelectオブジェクトで動作し、ロードされたアイテムのIDを取得する代わりにDBにリクエストを行うため、正しいフィルタリングされた量を返します。getAllIds()$products->getIds()

のような基本的な関数countと言語の構造は、コレクションの読み込みforeach()プロセスをトリガーすることに注意してください。

于 2012-09-12T13:44:59.677 に答える