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

Doctrine2 PHP Discussion :

setMaxResults() limite le résultat de mes leftjoin()


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juin 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 2
    Par défaut setMaxResults() limite le résultat de mes leftjoin()
    Bonjour, j'ai un problème avec une requête toute simple.

    J'ai 10 mods liés à 300 vidéos (pour l'exemple).
    J'aimerais récupérer 3 articles et toutes les vidéos qui sont liées.

    Je fait donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        $mods = $rp->getMods(3);
     
        public function getMods($nombre)
        {
            $qb = $this->createQueryBuilder('m');
     
            $qb->leftJoin('m.videos', 'v')
               ->addSelect('v')
               ->setMaxResults($nombre);
     
            return $qb->getQuery()->getResult();
        }
    Lorsque j'affiche le contenu il y a un problème, je n'ai pas 3 mods de récupéré mais qu'un seul avec 3 vidéos !

    Si je passe la variable à 5, je récupère 2 mods dont un à 3 vidéos et l'autre 2 vidéos.

    Le problème: Le setMaxResults() limite non pas le nombre de mods récupéré, mais l'ensemble de ce qui est récupéré et join (mods + vidéos).

    Savez vous comment résoudre ce problème svp ?

    Je tiens tout de même à dire que j'ai pas mal fait de recherche sur le problème, j'ai posté sur le site du 0, lu de la doc et passé facilement 5h à tester des requêtes différentes pour avoir au final aucun résultat.

    Voilà, merci d'avance à ceux qui prendront le temps de me venir en aide et bonne soirée

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    Le setMaxResults() limite non pas le nombre de mods récupéré, mais l'ensemble de ce qui est récupéré et join (mods + vidéos).
    oui cela est expliqué dans la doc
    If your query contains a fetch-joined collection specifying the result limit methods are not working as you would expect. Set Max Results restricts the number of database result rows, however in the case of fetch-joined collections one root entity might appear in many rows, effectively hydrating less than the specified number of results.
    http://docs.doctrine-project.org/pro...dql-query-only



    Essaie en utilisant le composant Paginator pour effectuer cela:
    http://docs.doctrine-project.org/en/...agination.html
    Normalement il génère une requete intermédiaire sur le nombre d'entité afin de gérer le cas de ce genre de jointure.
    Perform a Limit Subquery with DISTINCT to find all ids of the entity in from on the current page.

  3. #3
    Membre émérite
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Par défaut
    Bonjour,

    Je suppose que la relation entre mods et vidéos est de type one to many.

    Tu peux essayer de récupérer tes vidéos dans l'autre sens.

    Je m'explique par l'exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
        public function getModsWithVideos($idMod, $nombre)
        {
            $qb = $this->createQueryBuilder('v');
     
            $qb->leftJoin(v.mods', 'm')
               ->addSelect('m')
               ->where('m.id = $idMod')
               ->setMaxResults($nombre);
     
            return $qb->getQuery()->getResult();
        }
    Et la du coup tu récupére nombres de vidéos de 1 mod après à voir à rajouter peut être un orderBy et si tu veux d'autre mod tu peux rajouter des orWhere

  4. #4
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Je viens de tomber sur la même problématique.
    Résolue en 2 lignes en utilisant effectivement l'objet Paginator.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    use Doctrine\ORM\Tools\Pagination\Paginator;
     
    //...
    $objQuery->setMaxResults($limit);
    $results = new Paginator($objQuery, $fetchJoin = true);
    Inconvénient : une requête supplémentaire.

    ++

Discussions similaires

  1. Limiter les résultats d'une requête à \today\' - n jours
    Par Eddy Duflos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/10/2005, 08h46
  2. Limiter le résultat des résultats
    Par francois78 dans le forum Access
    Réponses: 2
    Dernier message: 15/06/2005, 12h48
  3. Réponses: 4
    Dernier message: 14/12/2004, 14h34
  4. Réponses: 2
    Dernier message: 21/09/2004, 19h01
  5. limiter le résultat retourné par le count
    Par SuperFoustan dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/08/2003, 12h10

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