11

Magentoにヘルパーメソッドがあり、無関係なコレクションの数を取得する必要があります。これに加えて、カテゴリ内の各製品、つまり製品リストビューの各製品についてこの情報が必要です。そのため、製品リストのレンダリング中に、多くのコレクションを繰り返し作成する可能性があります。

コレクションの数を取得する最も効率的な方法は何ですか。つまり、モデルからのデータは必要ありません。モデルがいくつあるかだけです。

単純ですか:

Mage::getResourceModel('mymodule/mymodel_collection')->addFilter('myattribute', $value)->count()

または、これを行うためのより効率的な方法はありますか?

4

5 に答える 5

72

コレクション内のアイテムをカウントするには、次のgetSize()方法を使用します。

$collection->getSize();

phpcount()関数またはcount()コレクションのメソッドを次のように使用しないでください。

count($collection)
$collection->count()

関数/メソッドを使用するとcount()、Magentoはデータベースからコレクションのすべてのアイテムをロードします。大規模なコレクションでは、大量のメモリ使用量が発生し、次のような問題が発生する可能性がありますFatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 71 bytes)...

于 2012-08-08T15:55:43.413 に答える
1

次のようにしてみてください:

$collection = Mage::getResourceModel('mymodule/mymodel_collection')->addFieldFilter('myattribute', $value);
$collection->count();
//or
$collection->getSize();
于 2012-07-10T18:52:15.640 に答える
0

組み込みのMagentoメソッドを使用して、これを行う最も効率的な方法は次のとおりです。

$ids = Mage::getModel('catalog/product')
                ->getCollection()
                ->addAttributeToSelect('entity_id')
                ->addFieldToFilter('status', array('eq'=>'1'))
                ->addFieldToFilter('visibility', array('eq'=>'4'))
                ->addFieldToFilter('type_id', array('in'=>array('simple')))
                ->getAllIds();
        var_dump(count($ids));
于 2014-07-22T17:29:55.347 に答える
-2
/**
     * Retrieve collection all items count
     *
     * @return int
     */
    public function getSize()
    {
        $this->load();
        if (is_null($this->_totalRecords)) {
            $this->_totalRecords = count($this->getItems());
        }
        return intval($this->_totalRecords);
    }

したがって、getSize()はより効率的ではありません。

于 2013-08-20T23:08:10.717 に答える
-14

とても良い質問です。ソースコードで見つけたものから、これはVarien_Data_Collectionで次のことを実行しますが、最速のオプションです。

public function count()
{
    $this->load();
    return count($this->_items);
}

したがって、個々のアイテムを繰り返し処理した場合と同じように、通常の処理を実行して、指定したものをロードします。ここには魔法のSQLはありませんCOUNT()getSelectCountSql()製品のカウントと関係があると私が見つけた他の唯一のメソッドはとですがgetProductCountSelect()、SQLコードを返すだけです。

しかし、EAV全体とMagentoのクエリビルダーは非常に賢いので、それほど大したことではないはずです。また、Magentoではあらゆる種類のキャッシングが行われているに違いありません。

つまり、そうです。製品コレクション内の製品の数を数えるのが最も速いオプションです。

于 2012-07-10T17:16:47.637 に答える