Magentoのmysql_num_rowsと同等の関数は何ですか?
1 に答える
Magentoの場合、適切な同等物はPHPのcount()
関数です。
なんで?
Magentoは通常、Varien_Data_Collection
インスタンスを使用して、複数のレコードを含む結果セットをフェッチします。Varienは、これらのコレクションに遅延読み込みパターンを実装します。つまり、実際に必要になる前に結果セットがフェッチされることはありません。
このVarien_Data_Collection
クラスを見ると、このクラスがPHPのCountableインターフェイスとこのインターフェイスの適切なcount()
メソッドを実装していることがわかります。
class Varien_Data_Collection implements IteratorAggregate, Countable
{
:
public function count()
{
$this->load();
return count($this->_items);
}
:
}
今、レコードのカウントと遅延読み込みが関係していることを自問している場合は、コレクションを通常のMagentoの方法でクエリすることを知っておく必要があります。たとえば、次のようになります。
$collection = Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter(
'status',
Mage_Catalog_Model_Product_Status::STATUS_ENABLED
);
結果セットをまったくフェッチしません。しかし、まだフェッチされていない結果セットのレコードをどのようにカウントしますか?そうです、できません。そして、どちらもできませんmysql_num_rows
。最初に結果セットをフェッチします。
さて、あなたcount()
がコレクションを呼び出すとき、例えばによって
$n = count($collection);
PHPのコアcount()
関数は、渡された引数がインターフェースを$collection
実装しCountable
、独自のcount()
メソッドが定義されていることを検出するため、それを呼び出します。
これにより、実際に結果セット*をフェッチしてに格納し$this->_items
、最終的にレコードをカウントして数を返すことができます。
* Magentoforeach ($collection as $product)
では、実際に結果セットをフェッチするために呼び出すこともできますが、それは別の話です。