2009-12-01 7 views
6

Je suis sur le point d'utiliser la classe Zend_Paginator dans mon projet. J'ai trouvé des exemples de la classe sur internet. L'un d'entre eux estZend_Paginator; Est-ce optimisé?

$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; 

sur la première ligne, il sélectionne réellement toutes les lignes de table_name. Que faire si j'ai une table avec 50000 lignes? Ce serait très inefficace.

Existe-t-il un autre moyen d'utiliser Zend Paginator?

Répondre

12

A propos de ce problème, vous pourriez être intéressé par cette section du manuel: 39.2.2. The DbSelect and DbTableSelect adapter, qui stipule (citant, Souligné par l'auteur):

... les adaptateurs de bases de données ont besoin d'une explication plus détaillée .
Contrairement à populaire croire, ces adaptateurs ne pas chercher tous les enregistrements de la base de données en de les compter.

À la place, les adaptateurs manipule la requête d'origine pour générer la requête COUNT correspondante.
Paginator exécute ensuite cette requête COUNT pour obtenir le nombre de lignes .

Cela nécessite un aller-retour supplémentaire à la base de données, mais ce est beaucoup plus rapide que la récupération d'un résultat complet défini et en utilisant count(). En particulier avec de grandes collections de données .

(Il y a plus à lire sur cette page - et il est un exemple qui devrait vous donner plus d'informations)


L'idée est que vous ne récupérer toutes les données vous-même plus, mais vous dire à Zend_Paginator quel adaptateur il doit utiliser pour accéder à vos données.

Cet adaptateur sera spécifique à « Les données sont extraites par une requête SQL », et saura paginate directement sur le côté de la base de données - ce qui signifie aller chercher uniquement ce qui est nécessaire, et non toutes les données comme vous avez d'abord fait.

7

Je recommande de passer un objet Zend_Db_Select comme Zend_Paginator::factory($select); plutôt que de passer un jeu de lignes résultat. Sinon, vous sélectionnez le jeu de résultats complet, puis vous effectuez la pagination. Dans votre solution actuelle, si vous aviez un million de lignes, vous les sélectionniez toutes avant d'obtenir le bloc de lignes défini par la page en cours.

+0

+1 c'est ce que nous utilisons également pour les grands ensembles de données. – Aaron