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 :

Requête sur une relation OneToMany


Sujet :

Doctrine2 PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Par défaut Requête sur une relation OneToMany
    Bonjour,

    Dans une application, j'ai une relation OneToMany entre deux entités. En l'occurence, Article et Commentaire.
    Voici les attributs intéressants de mes entités :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Article {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
        /**
         * @ORM\OneToMany(targetEntity="Commentaire", mappedBy="article")
         * @ORM\OrderBy({"createdAt" = "ASC"})
         */
        protected $commentaires;
     
        /* ... */
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class Commentaire {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
        /**
         * @ORM\ManyToOne(targetEntity="Article", inversedBy="commentaires")
         * @ORM\JoinColumn(name="article_id", referencedColumnName="id", nullable=false)
         */
        protected $article;
     
        /**
         * @var \DateTime
         *
         * @ORM\Column(type="datetime")
         * @Gedmo\Timestampable(on="create")
         */
        protected $createdAt;
     
        /* ... */
    }
    J'aimerais récupérer les 3 derniers articles commentés.

    Voici en SQL à quoi devrait ressembler ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `topic_id` FROM `comment` GROUP BY `topic_id` ORDER BY `createdAt` DESC LIMIT 3
    Via ma console sql, j'obtiens bel et bien ma liste de topic_id.

    Mon problème se situe en la traduction de la requête en DQL (Doctrine Query Language).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function findByLastCommented($maxResults = 3)
    {
    	return $this->getEntityManager()
                ->createQuery('SELECT c.article FROM AcmeDefaultBundle:Commentaire c GROUP BY c.article_id ORDER BY c.createdAt DESC')
                ->getResult();
    }
    Cette méthode provoque une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Semantical Error] line 0, col 9 near 'article FROM AcmeDefaultBundle:Comment': Error: Invalid PathExpression. Must be a StateFieldPathExpression.
    Je dois avouer que je ne vois pas comment puis-je faire en sorte que ma requête me renvoit la liste des objets Article dernièrement commentés.

    Merci d'avance pour votre aide.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Par défaut
    Pour récupérer la liste des commentaires sous forme d'objet, Doctrine a besoin de mapper un objet correspondant aux tables sql, il lui faut dont l'ensemble des tables qui sont utilisées. C'est pour cela qu'il faut faire une jointure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb	->select('a')
    	->from('AcmeDefaultBundle:Commentaire', 'c')
    	->join('c.article', 'a')
    	->orderBy('c.createdAt', 'DESC');
    Par exemple.

Discussions similaires

  1. Requête sur une table de relation 0,n - 0,n
    Par Jmdu_44fr dans le forum SQL
    Réponses: 4
    Dernier message: 22/09/2011, 16h28
  2. Requête Criteria sur une relation ManyToMany
    Par waldo2188 dans le forum Hibernate
    Réponses: 0
    Dernier message: 04/11/2009, 11h29
  3. Requête sur une partie d'un champ
    Par KEROZEN dans le forum Access
    Réponses: 4
    Dernier message: 26/03/2006, 20h50
  4. Question sur une relation ternaire dans un MCD
    Par sylsau dans le forum Schéma
    Réponses: 5
    Dernier message: 05/03/2006, 20h00
  5. Requête sur une requête dynamique...
    Par kluh dans le forum Access
    Réponses: 4
    Dernier message: 17/11/2005, 19h59

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