6 votes

Jointure droite dans Doctrine2 pour Symfony2

J'ai la requête MySQL suivante qui fonctionne :

SELECT *
FROM bogenantworten a
    RIGHT JOIN
        bogenfragen f ON f.id = a.bogenfragen_id
        AND a.personen_id = 3,
    BogenTyp t, 
    BogenFragenGruppe g
WHERE
    t.id = f.fragentyp_id AND
    g.id = f.fragengruppen_id AND
    t.id = 1
ORDER BY f.sortierung ASC

J'ai maintenant besoin de cela dans Doctrine2 DQL ou QueryBuilder. J'ai déjà appris que D2 m'oblige à penser en objets, mais je n'ai pas trouvé de conseils sur la façon de marquer mes entités pour que cela fonctionne.

J'aimerais que la requête MySQL ci-dessus fonctionne dans mon application Symfony2 ou que l'on m'aide à annoter mes entités de manière à ce que la connexion de jointure droite entre BogenAntworten et BogenFragen fonctionne (le 3 et le 1 sont des paramètres, juste pour que vous le sachiez). J'ai déjà défini les annotations OneToMany et ManyToOne pour toutes mes entités, mais j'ai besoin de quelque chose pour faire fonctionner une jointure droite/gauche.

Si vous souhaitez m'aider dans la conception de mon entité :

J'ai des personnes (table Person) qui répondent (table BogenAntworten) à des questions (table BogenFragen), et lorsque j'affiche la liste des questions, j'obtiens soit la dernière réponse de cette question (besoin d'UPDATE lors de la sauvegarde), soit il n'y en a pas et je dois la créer (INSERT lors de la sauvegarde). Les questions sont également classées dans un des nombreux types (table BogenTyp) et dans un des nombreux groupes (table BogenFragenGruppe).

Des idées ?

4voto

meilon Points 583

OK, je l'ai trouvé moi-même. Le QueryBuilder de Doctrine2 supporte un leftJoin (qui est identique au RIGHT JOIN si vous intervertissez les deux tables). Pour ceux qui ont besoin de code, voici la requête SQL ci-dessus construite avec QueryBuilder :

$query = $em->createQueryBuilder()
    ->select(array('f.id', 'f.frage', 'f.sortierung', 'a.antwort', 'g.name'))
    ->from('MySuperBundle:BogenFragen', 'f')
    ->leftJoin('f.bogenantworten', 'a', 'WITH', 'a.personen = :pid')
    ->from('MySuperBundle:BogenTyp', 't')
    ->from('MySuperBundle:BogenFragenGruppe', 'g')
    ->where('t.id = :tid')
    ->andWhere('t.id = f.bogentypen')
    ->andWhere('g.id = f.bogenfragengruppe')
    ->orderBy('f.sortierung', 'ASC')
    ->setParameter('tid', 1)
    ->setParameter('pid', 3)
    ->getQuery();

(Les paramètres sont en fait dynamiques, mais pour faciliter la lecture, j'ai utilisé les numéros de l'instruction SQL d'origine).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X