8
votes

Comment utiliser Gauche Rejoignez comme Droite Join dans la doctrine

Donc, je me suis rattrapé mon cerveau pendant un moment maintenant. Dans la doctrine, il n'y a pas de concept de jointure droite. Je sais que vous pouvez utiliser une joindre à gauche comme une jointure droite mais je ne peux pas comprendre mon exemple, c'est pourquoi je suis ici.

Mon exemple: J'ai une entité dans la doctrine qui a une relation individuelle avec elle-même appelée "parent". J'essaie d'obtenir toutes les entités et leurs enfants (s'ils existent) sans doublons. p>

avec un join droit C'est simple car je peux dire: p> xxx pré>

mais en utilisant une jointure gauche, je suis retourné des résultats que je ne peux pas comprendre quoi La clause où devrait être de les filtrer. P>

Donc, ma question est "La doctrine a-t-elle une façon de faire de la bonne jointure" ou "Comment puis-je utiliser l'opération de jointure gauche comme une jointure droite"? p>

--- EDIT --- P>

Vous êtes correct dans ce que vous dites de changer la commande des tables que je sélectionne, mais j'utilise la doctrine afin que la relation soit la relation entre enfant-> parent . Voici ma requête de doctrine: p>

Mon entité: P>

SELECT child.id, child.changed_timestamp, child.parent_entity_id, parent.id, 
 parent.changed_timestamp, parent.parent_entity_id 
FROM content child 
RIGHT JOIN content parent ON child.parent_entity_id = parent.id   
WHERE parent.parent_entity_id is null
ORDER BY parent.id ASC

child_id    child_timestamp parent_entity_id    parent_id   parent_timestamp    parent_entity_id
200         9/20/12 16:02   1                   1           8/16/12 20:29       NULL
NULL        NULL            NULL                7           9/20/12 16:07       NULL
NULL        NULL            NULL                8           8/17/12 16:08       NULL
NULL        NULL            NULL                9           8/17/12 20:44       NULL
NULL        NULL            NULL                10          8/17/12 21:03       NULL
NULL        NULL            NULL                11          8/17/12 21:17       NULL
NULL        NULL            NULL                194         9/19/12 9:58        NULL
NULL        NULL            NULL                195         9/20/12 10:38       NULL
197         NULL            196                 196         9/19/12 11:58       NULL
NULL        NULL            NULL                202         9/20/12 16:35       NULL
206         NULL            204                 204         9/21/12 8:41        NULL


3 commentaires

Enfant Droite Rejoignez TableParent sur Parent.Id = Enfant.parent_id est identique à celui TableParent Gauche Joindre enfant sur parent.Id = enfant.parent_id


Veuillez fournir des données d'échantillonnage et une sortie souhaitée.


Salut @Alex Mamut, étiez-vous capable de comprendre comment faire une bonne jointure? J'ai le même problème ici.


6 Réponses :


0
votes

@ 491243 Le commentaire est correct: si vous utilisiez SQL, ce serait un problème trivial car les jointures gauche et droite sont facilement convertibles et les prédicats relationnels peuvent être exprimés dans n'importe quel ordre.

Le vrai problème semble ne pas être de savoir comment Réécrivez une jointure droite comme une gauche, mais comment traverser votre relation dans l'autre sens. Vraisemblablement, vous ne pouvez pas simplement faire quelque chose comme ça?: P>

$em->createQueryBuilder()
->select(array('child', 'parent'))
->from('Entity', 'parent')
->leftjoin('parent.child', 'child')
->orderBy('parent.id','asc')
->getQuery()
->execute();


0 commentaires

0
votes

Essayez celui-ci:

SELECT
    parenttable.*, childtable.*
FROM childtable
RIGHT JOIN parenttable ON parenttable.id = childtable.parent_id
WHERE
    parenttable.parent_id IS NULL
    AND
    childtable.childid IS NOT NULL;


0 commentaires

0
votes

La joindre de gauche que vous avez affichée n'a pas eu: où parent.parent_entity_id est null

Je vais deviner que dans vos données, cela signifie que l'enregistrement n'est en soi pas un enfant.

Donc, si vous avez juste besoin de la bonne join SQL, vous avez fourni à gauche, vous y allez:

Sélectionnez Enfant.Id, Enfant.Changed_Timestamp, Enfant.Prent_entity_ID, Parent.Id, parent.changed_timestamp, parent.parent_entity_id De Content Parent Gauche En Enfant Content Enfant.Parent_Enty_ID = Parent.Id

Où parent.parent_entity_id est null Commandez par parent.id asc

Remarque: Si vos données permettent plusieurs générations, par exemple. Grand-enfants, etc., la clause ci-dessus est filtrée non seulement des enfants, mais aussi des grands-enfants. Cela a des implications sur les données de l'enfant retournées: les enfants ne seront pas retournés s'ils sont des grands-enfants.


0 commentaires

0
votes

Pas vraiment familier avec le script de doctrine, mais ... Cet ancien style Joindre code> doit atteindre le même résultat que l'inscription à droite code> dans la plupart des scripts SQL:

    SELECT parent.*, child.*
    FROM table child, table parent 
    WHERE parent.id = child.parent_id
    OR child.parent_id IS NULL;


0 commentaires

0
votes

Ces deux déclarations sont équivalentes: xxx

Je n'utilise jamais la bonne jointure. Je pense que cela n'est inclus que dans SQL pour l'exhaustivité.


0 commentaires

0
votes

Vous pouvez utiliser la clause de jointure qui ont le même résultat qu'un join droit. XXX


0 commentaires