Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Db
Zend_Db Forum d'entraide pour le composant Zend_Db du Zend Framework (création de requêtes, abstraction, ORM etc.). Avant de poster -> FAQ Zend_Db.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/03/2011, 12h59   #1
Invité de passage
 
Inscription : novembre 2002
Messages : 14
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 14
Points : 4
Points : 4
Par défaut Même select() pour limit et total ?

Bonjour à tous!

Pour un projet de listing de livres, je suis passé de Doctrine à Zend_Db pour la gestion de la base de données. J'ai probablement pris pleins d'habitudes bonnes et moins bonnes avec Doctrine, mais là, je sèche méchamment sur un point.

J'ai une requête comme ceci (en gros):

Code :
1
2
3
4
5
6
7
8
$table = new Livres();
$select = $table->select()->joinLeft(...)->order(...)
    ->where('un filtre utilisateur')
    ->where('un autre filtre utilisateur')
    ->where('etc...')
    ->limit(10, 20);
 
$rowset = $table->fetchAll($select);
Ceci fonctionne à merveille. Tout est très bien, c'est très bien. Maintenant, je souhaite retrouver le total (là je n'ai que 10 éléments).

J'ai donc tenté un truc tout bête:

Code :
1
2
3
4
5
6
7
8
 
// juste en dessous:
        $select
            ->reset(Zend_Db_Select::LIMIT_COUNT)
            ->reset(Zend_Db_Select::LIMIT_OFFSET);
 
        $rows = $table->fetchAll($select);
        echo $rows->count();
Et c'est là que rien ne va plus. ça me retourne 4x tous les résultats. Je n'ai aucune idée pourquoi.

Certes, je pourrais réécrire toute la requête en changeant le select et en ne mettant pas la limit, mais je me demandais si on pouvait trafiquer un select pour faire un count "intelligent".

Merci d'avance pour vos éclaircissements ou vos conseils!
rekam
rekam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 14h58   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Bonjour,

pour obtenir un nombre de lignes autant utiliser les fonctions d'agrégations de SQL. Pour cela, il suffit de construire le select sans clause LIMIT, de le dupliquer, et de remplacer dans la copie la liste des champs par un COUNT(*). Tu peux ensuite ajouter le LIMIT à la requête d'origine pour obtenir ton jeu d'enregistrements. Ce qui donne:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$select = $table->select()->joinLeft(...)->order(...)
    ->where('un filtre utilisateur')
    ->where('un autre filtre utilisateur')
    ->where('etc...');
 
$select_count = clone $select;
$select_count->reset(Zend_Db_Select::COLUMNS);
$select_count->columns(array('nb' => 'COUNT(*)'));
$res = $select_count->query()->fetchAll();
$nb_rows = $res[0]['nb'];
unset($select_count);
 
$select->limit(10, 20);
J'utilise cette technique dans une aide d'action « maison » pour alimenter un jqGrid, et cela fonctionne parfaitement sans consommer inutilement des ressources. Un seul bémol, la technique du COUNT(*) ne fonctionne pas si la requête comporte une clause DISTINCT; dans ce cas, il n'y a rien d'autre à faire que d'exécuter la requête originale sans LIMIT, et de compter le nombre de lignes dans le tableau de résultat (ce que tu as tenté de faire).
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 17h29   #3
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
On peut également utiliser l'option SQL_CALC_FOUND_ROWS.

Plus d'infos ici :

http://dev.mysql.com/doc/refman/5.0/...functions.html
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 09h28   #4
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Citation:
Envoyé par s.n.a.f.u Voir le message
On peut également utiliser l'option SQL_CALC_FOUND_ROWS.
En dehors du fait qu'il s'agit d'une extension à SQL spécifique à MySQL, je me demande si la syntaxe des requêtes utilisant cette fonction est compatible avec Zend_Db_Select... De plus, il faut lancer derrière un SELECT FOUND_ROWS(); pour obtenir le total de lignes. C'est peut-être un plus performant en terme de requête, mais le code PHP reste sensiblement le même.
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h02.


 
 
 
 
Partenaires

Hébergement Web