6

プロジェクトで Zend_Paginator クラスを使用しようとしています。クラスの例をインターネットで見つけました。それらの1つは

$sql = 'SELECT * FROM table_name ';    
$result = $db->fetchAll($sql);    
$page=$this->_getParam('page',1);    
$paginator = Zend_Paginator::factory($result);   
 $paginator->setItemCountPerPage(10));   
 $paginator->setCurrentPageNumber($page);   
 $this->view->paginator=$paginator;

最初の行では、実際には table_name からすべての行を選択しています。50000 行のテーブルがある場合はどうなりますか? それは非常に非効率的です。

Zend Paginator を使用する他の方法はありますか?

4

2 に答える 2

12

この問題については、マニュアルの次のセクションに興味があるかもしれません: 39.2.2. DbSelect および DbTableSelect アダプター(引用、強調鉱山) :

... データベース アダプタには、より詳細な説明が必要です。
一般に信じられていることとは反対に、これらのアダプターは、データベースからすべてのレコードを取得してカウントするわけではありません。

代わりに、アダプターは元のクエリを操作して、対応するクエリを生成し COUNTます。
Paginator はそのCOUNTクエリを実行して、行数を取得します。

これにはデータベースへの余分なラウンドトリップが必要ですが、結果セット全体をフェッチして を使用するよりも何倍も高速ですcount()
特に大規模なデータ コレクションでは。

(そのページにはさらに読むべきものがあります -- そして、より多くの情報を提供する例があります)


自分ですべてのデータを取得することはもう ありませんが、Zend_Paginatorデータにアクセスするために使用する必要があるアダプタを指定する必要があります。

このアダプターは、「 SQL クエリを介してフェッチされるデータ」に固有であり、データベース側で直接ページネーションする方法を認識します。これは、最初に行ったようにすべてのデータではなく、必要なものだけをフェッチすることを意味します。

于 2009-12-01T22:44:47.400 に答える
7

結果の行セットを渡すのではなく、Zend_Db_Selectオブジェクトを渡すことをお勧めします。Zend_Paginator::factory($select);それ以外の場合は、結果セット全体を選択してからページネーションを実行します。現在のソリューションでは、100万行ある場合、現在のページで定義されている行のチャンクを取得する前に、それらすべてを選択します。

于 2009-12-01T23:06:27.837 に答える