2 votes

Est-il possible de convertir en DQL ou Doctrine Query Builder ?

J'ai 3 tableaux avec des colonnes

A:
    id
B:
    id
    a_id
C:
    id
    b.id

avec une requête native :

SELECT a.id, b.id, c.id
FROM A as a 
LEFT JOIN B as b 
    INNER JOIN C as c ON b.id = c.b_id
ON a.id = b.a_id

J'ai essayé

SELECT a.id, b.id, c.id 
    FROM App\HomeBundle\Entity\A as a
    LEFT JOIN App\HomeBundle\Entity\B as b
        INNER JOIN App\HomeBundle\Entity\C as c
        ON c.id = c.bId
    ON a.id = b.aId

J'ai obtenu une erreur :

Error: Expected Literal, got 'JOIN' 

Est-il possible de convertir ma requête native en DQL ou query builder ? Si c'est possible, à quoi cela ressemblera-t-il ?

1voto

BellevueBob Points 9142

Ce n'est qu'une supposition, mais c'est trop long pour un commentaire. Si je suis complètement à côté de la plaque, je supprimerai cette réponse.

En supposant que votre requête native soit syntaxiquement correcte, MySQL applique peut-être le dernier ON au résultat d'un INNER JOIN entre b y c . Si c'est le cas, voyez si cela donne le même résultat :

SELECT a.id, b.id, c.id 
FROM App\HomeBundle\Entity\A as a
LEFT JOIN (
    SELECT bx.aID
    FROM   App\HomeBundle\Entity\B as bx
    INNER JOIN App\HomeBundle\Entity\C as c
    ON    bx.id = c.bId
    ) b
ON a.id = b.aId

Note : J'ai corrigé ce que je crois être une erreur dans votre tentative de solution (où vous dites ON c.id = c.bId ).

0voto

UFTimmy Points 331

Il s'agit d'une question plus ancienne, mais je pense que vous devez JOINDRE sur la relation, et non sur l'entité.

Par exemple, au lieu de

SELECT a
    FROM Entity\A as a
    LEFT JOIN Entity\B as b

Il devrait l'être :

SELECT a
    FROM Entity\A as a
    LEFT JOIN a.entityB as b

Si cela n'est pas clair, a.entityB est une propriété de l'entité A, appelée "entityB". Cette propriété définit la relation entre A et B.

Lorsque vous joignez simplement une entité à une autre, Doctrine ne sait pas comment elles sont liées. Cependant, si vous joignez sur la base de la propriété, Doctrine peut utiliser les annotations (ou autre mapping) pour déterminer la relation entre A et B.

0voto

Henry Points 117

J'ai toujours dû utiliser le WITH au lieu de ON lors de l'utilisation de la doctrine.

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