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> 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
6 Réponses :
@ 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();
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;
La joindre de gauche que vous avez affichée n'a pas eu: où parent.parent_entity_id est null p>
Je vais deviner que dans vos données, cela signifie que l'enregistrement n'est en soi pas un enfant. p>
Donc, si vous avez juste besoin de la bonne join SQL, vous avez fourni à gauche, vous y allez: P>
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 p>
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. P>
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;
Ces deux déclarations sont équivalentes: Je n'utilise jamais la bonne jointure. Je pense que cela n'est inclus que dans SQL pour l'exhaustivité. P> p>
Vous pouvez utiliser la clause de jointure qui ont le même résultat qu'un join droit.
Enfant Droite Rejoignez TableParent sur Parent.Id = Enfant.parent_id Code> est identique à celui
TableParent Gauche Joindre enfant sur parent.Id = enfant.parent_id code>
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.