IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Symfony sfDoctrinePager et LIMIT de la requête


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 42
    Par défaut Symfony sfDoctrinePager et LIMIT de la requête
    Bonjour,

    J'ai une table mysql avec 5000 lignes. Je veux extraire les dernières 1000 et les paginer avec sfDoctrinePage() à raison de 10 par page.

    Le problème est que pager->setQuery() ignore mon LIMIT et me retourne les 5000 lignes de la table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $query = "select * from my_table limit 1000";
    $this->pager = new sfDoctrinePager('ma_table', 10);
    $this->pager->setQuery($query);
    Merci pour votre aide

  2. #2
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    Je crois que tu n'as pas compris le fonctionnement du pager.

    C'est lui qui gère le limit.
    La requête peu avoir toutes les conditions que tu veux mais pas le limit.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 42
    Par défaut
    Merci, c'est ce que j'ai cru comprendre, les LIMIT sont réécris.

    Mais comment faire dans ce cas pour éviter de charger toutes les 5000 lignes de ma table?
    Il y a bien cette méthode mais elle semble ne rien faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->pager->setMaxRecordLimit(1000);

  4. #4
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    Si c'est le pager qui gère ton limit il ne va pas charger les 5000 résultat mais juste le nombre de résultat par page

    c'est pour ça que tu as un limit et un offset.

  5. #5
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 42
    Par défaut
    Mais pour savoir combien de pages retourne ma requête et afficher les liens de navigation entre les pages, genre "<< 1, 2, 3...x >>", il doit bien aller chercher toutes les 5000 lignes, non? Sinon comment savoir le nombre de pages à afficher?

    Ce qui, j'ajoute, ralenti sensiblement ma page

  6. #6
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    ben en faisant un count () de la condition initiale

  7. #7
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 42
    Par défaut
    Merci

    Comment je fais si je veux quand même limiter le nombre de mes pages?
    Avec mes 5000 lignes, j'ai 500 pages à raison de 10 par page.
    Mais je veux juste les dernières 1000 lignes, donc juste 100 pages à raison de 10 par page.

  8. #8
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    c'est pas possible si ta requête à la base te retourne 5000 résultats c'est que tes conditions sont mauvaises.

    Et comment peux tu n'afficher que 1000 résultats alors que ta requête base en retourne 5000 ????

  9. #9
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 42
    Par défaut
    Ma requête de base ne retourne pas 5000 lignes, c'est la table qui en contient 5000.
    Le problème c'est que sfDoctrinePager('ma_table') prend tout ce qu'il y dans la table lors de la création de l'instance. Je cherche donc un moyen de contourner ce comportement par défaut et ne retourner que les 1000 dernières lignes.

    J'ai essayé: $this->pager->getQuery()->limit(1000) mais rien.

    La documentation semble dire que $this->pager->setMaxRecordLimit(1000) est fait pour ça, mais rien non plus de ce côté

  10. #10
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    Voila la doc http://www.symfony-project.org/jobee...Doctrine/fr/07

    Si tu force ton limit tu vas retourne tes 1000 résultats dans une page.

    Doctrine n'appelle pas du tout tes 5000 résultats, il construit la requête en ajoutant un limit. donc ça c'est sur qu'il te retournera au max que le nombre que tu as mis indiqué.

  11. #11
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 42
    Par défaut
    Là franchement ya un truc qui m'échappe grave, je ne vois pas où FORCER mon limit à 1000.
    Je l'ai mis dans le modèle, mais marche pas non plus. Comment le forcer à ne retourner que les derniers 1000 et les paginer ensuite?

    Voici mon code:
    La table Amis a 5000 lignes.

    Model:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class AmisTable extends Doctrine_Table {
      public static function getInstance() {
        return Doctrine_Core::getTable('Amis');
      }
     
      static public function getAmis()
        {
            $dqlQuery = self::getInstance()
                ->createQuery('a')
                ->limit(1000);
             return $dqlQuery;
        }
    }
    Actions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $query = AmisTable::getAmis();
    $this->pager = new sfDoctrinePager('Amis', 10);
    $currentPage = $request->getParameter('page', 1);
    $this->pager->setPage($currentPage);
    $this->pager->setQuery($query);
    $this->pager->init();

  12. #12
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    dans le sfDoctrinePager () tu as déclarer avec avoir une limit de 10, tu auras donc les 10 premier résultat en fonction de la page que tu as donné.

    aucune des requête de doctrine te récupère les 5000 résultats.
    Si tu ne veux pas tes 5000 résultats met des conditions.

    Tu cherche a faire un truc impossible, car c'est tu demande une pagination donc tu as déjà un limit dans la requête qui est de 10 dans ton cas, un autre limit qui ne correspond à rien.

    Je te conseil de lire comment fonctionne le limit en SQL.

  13. #13
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 42
    Par défaut
    Franchement je suis perdu!

    Avec ce code en haut ça m'affiche dans mon view une page avec 20 items.
    Tout va bien jusque là. En bas la pagination: 1,2,3... 500 pages. Ce sont ces 500 pages que je ne veux pas avoir, je veux juste 100.
    Et impossible de trouver une solution simple. Comment tu ferais toi? Obligé de passer par un subquery?

  14. #14
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    ce que j'aimerai comprendre c'est pourquoi tu ne veux afficher que les 1000 premier ?
    En faisant ça tu n'auras jamais les 4000 résultats suivant.

    tu peux faire un sous select mais bon réfléchit bien a ce que je viens d'écrit avant, car la tu cherche à faire un fonctionnement anormale d'une base de données.

  15. #15
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 42
    Par défaut
    Oui c'est exactement ce que je veux, juste les 1000 derniers. Les 4000 plus anciens ne me sont pas important pour mon application.

    Passer par une subquery veut dire que le framework symfony n'a pas pensé à cette eventualité? Une subquery est toujours couteuse pour la performance.
    Ya donc pas moyen de faire ça normalement avec symfony et doctrine?

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 25
    Par défaut
    Il faut avouer que tout besoin est tout sauf classique, en generale on fournit la possibilité d'accéder à tout les éléments car qui peut le plus peut le moins.

    Quoiqu'il en soit, tu peux tout à fait réaliser ce que tu souhaite avec Symfo.
    Il suffit simplement que lorsque tu affiches les liens de pagination, tu te limite à afficher un lien vers la Xe page de résultat et non vers le maximum.

    Il faut voir le pager de Symfony comme un élément qui découpe automatiquement tes résultats de requête en autant de sous-page qu'il y a de " enregistrement / max_per_page ", il n'a rien a voir avec l'affichage des liens (qui est fait dans un template HTML).

    Dans ton cas, la pagination t'afficherais 1,2,3,...500 suivant la logique classique, mais tu peux tout simplement ne plus afficher cela mais plutôt 1,2,3,...,100 ou encore 1,2,3,..50,...100 etc.. en modifiant le template de pagination.

    Il n'y a à mon sens aucun interêt à limiter les résultats directement dans la query, ce que tu souhaites faire devrait typiquement passer par une surcharge de l'affichage qui n'affichera pas plus que la 100e page de résultats.

  17. #17
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    en reprenant ton besoin, tu as une table dans laquelle tu stock un "historique" mais dont tu ne veut "voir" que les 1000 derniers ?

    pourquoi ne pas utiliser le comportement sofDelete. tu fait tourner un batch qui supprime virtuellement les data trop anciennes et tu ne travaille qu'avec les dernières valeurs ?

  18. #18
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    @ufretin : limité du coté requête permet de ne pas accéder au données si l'utilisateur les passe en paramètre.

    @erictomcat : je suis tout a fait d'accord avec toi il a un problème de conception dans ça base de données.

  19. #19
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 42
    Par défaut
    Merci à tous pour vos efforts

    Mon souci est au niveau de la performance, je ne souhaite donc rien effacer. Afficher les 5000 lignes alors que pas tous les utilisateurs en auraient besoin me semble pas nécessaire.

    Ajouter un LIMIT aux dernières 1000 lignes seulement aiderait au niveau performance, non? Ou est-ce que ça ne changerait rien à l'affaire?

  20. #20
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    heu rien compris la manque des mots

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/09/2011, 09h58
  2. Limit dans une requête
    Par yamatoshi dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/02/2009, 14h25
  3. Problème de double limite dans une requête mysql
    Par bbbbruno dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/01/2009, 19h21
  4. Taille limite d'une requête SQL
    Par cradleofpain dans le forum VBScript
    Réponses: 2
    Dernier message: 16/05/2007, 14h10
  5. Limites de la requête multitable
    Par picatchou dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 26/11/2006, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo