Symfony 2: INNER JOIN bei nicht verwandten Tabellen mit Doktrin-Abfrage-Builder

Lesezeit: 4 Minuten

Benutzer-Avatar
0s1r1s

Ich versuche, eine Abfrage mit dem Doktrin-Abfrage-Generator zu erstellen, der eine nicht verwandte Tabelle wie folgt verbindet:

$query = $this->createQueryBuilder('gpr')
        ->select('gpr, p')
        ->innerJoin('TPost', 'p')
        ->where('gpr.contentId = p.contentId')

Aber das funktioniert nicht. Ich bekomme immer noch einen Fehler:

Fehler: Identifikationsvariable TPost im Join-Pfadausdruck verwendet, aber vorher nicht definiert.

Ich habe nach dieser Fehlermeldung gesucht und alle haben geantwortet, den Tabellenalias + Attribut wie p.someAttribute zu verwenden. Aber der Tisch, dem ich beitreten möchte, ist nicht mit dem Tisch verwandt, an dem ich meine Auswahl beginne.

Als normale MySQL-Abfrage würde ich es so schreiben:

SELECT * FROM t_group_publication_rel gpr 
INNER JOIN t_post p 
WHERE gpr.content_id = p.content_id

Irgendwelche Ideen, was ich falsch mache?

  • Wir können DQL verwenden, um einen Join mit nicht verwandten Objekten durchzuführen? Ich weiß nicht. Wenn möglich, ist es interessant =).

    – sensorario

    20. Juni 2012 um 9:41 Uhr

  • Warum gehst du nicht einfach bauen eine Beziehung zwischen diesen beiden, wenn Sie sich ihnen anschließen möchten?

    – dan-lee

    20. Juni 2012 um 9:45 Uhr

  • In diesem Fall würde eine Beziehung nicht ausreichen. Ich bräuchte Relationen zu 3 verschiedenen Tabellen und jeder Datensatz könnte nur einen Verweis auf 1 dieser 3 setzen.

    – 0s1r1s

    20. Juni 2012 um 10:06 Uhr

  • Ist es langsamer, wenn ich die Find-Methoden in meinem Controller verwende, anstatt eine Abfrage zu erstellen? Ich würde ja sagen, weil es viel mehr Abfragen im Hintergrund gibt, oder?

    – 0s1r1s

    20. Juni 2012 um 10:08 Uhr

  • Also ich meine nicht nur 1 Find-Methode. Die Kombination von 2 verschiedenen Funden in einer Schleife.

    – 0s1r1s

    20. Juni 2012 um 10:08 Uhr

Heute habe ich an einer ähnlichen Aufgabe gearbeitet und mich daran erinnert, dass ich dieses Problem eröffnet habe. Ich weiß nicht, seit welcher Version der Doktrin es funktioniert, aber im Moment können Sie den untergeordneten Klassen problemlos in der Vererbungszuordnung beitreten. Eine Abfrage wie diese funktioniert also ohne Probleme:

$query = $this->createQueryBuilder('c')
        ->select('c')
        ->leftJoin('MyBundleName:ChildOne', 'co', 'WITH', 'co.id = c.id')
        ->leftJoin('MyBundleName:ChildTwo', 'ct', 'WITH', 'ct.id = c.id')
        ->orderBy('c.createdAt', 'DESC')
        ->where('co.group = :group OR ct.group = :group')
        ->setParameter('group', $group)
        ->setMaxResults(20);

Ich starte die Abfrage in meiner übergeordneten Klasse, die Vererbungszuordnung verwendet. In meinem vorherigen Beitrag war es ein anderer Ausgangspunkt, aber das gleiche Problem, wenn ich mich recht erinnere.

Da es ein großes Problem war, als ich mit dieser Ausgabe begann, denke ich, dass es auch für andere Leute interessant sein könnte, die nichts davon wissen.

  • Vielen Dank ! Das hat wirklich geholfen, ich habe stundenlang gesucht.

    – Assil

    27. März 2014 um 22:47 Uhr

  • wenn ich nicht habe MyBundleName:ChildTwo Repository, ich möchte eine Abfrage mit Tabellennamen schreiben, was ist dann die Lösung.?

    – Mohammad Farid

    11. Juli 2016 um 12:22 Uhr

  • @MohammadFareed Der Verweis auf die Entität ist kein Repository, es ist entweder ein String in der Form ‘:‘ ODER der FQCN der Entitätsklasse, zB \AppBundle\Entity\ChildTwo::class

    – Levente Pánczél

    8. Oktober 2016 um 17:40 Uhr

  • Was ist der Unterschied zwischen der Verwendung von WITH oder ON?

    – Moll

    27. August 2021 um 2:26 Uhr

Benutzer-Avatar
Jamir

Joins zwischen Entitäten ohne Assoziationen waren bis Version 2.4 nicht möglich, wo Sie einen beliebigen Join mit der folgenden Syntax generieren können:

$query = $em->createQuery('SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email');

Bezug: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

  • Das ist fantastisch! Notiere dass der WITH -Klausel ist in diesem Fall erforderlich, sonst führt dies zu einem Syntaxfehler. Sie können jedoch einfach eine Dummy-Bedingung verwenden und im Wesentlichen einen echten Cross Join erhalten, den DQL sonst nicht unterstützt. Zum Beispiel: SELECT u FROM User u JOIN Items i WITH 0 = 0. Dies kann für komplexe Statistiken nützlich sein.

    – jlh

    25. Januar 2018 um 9:03 Uhr

Benutzer-Avatar
Jzapata

$dql = "SELECT 
    a, md.fisrtName , md.LastName, mj
    FROM MembersBundle:Memberdata md
        INNER JOIN MembersBundle:Address a WITH md = a.empID
        INNER JOIN MembersBundle:Memberjob mj WITH md = mj.memberData
            ...
    WHERE
        a.dateOfChange IS NULL
    AND WHERE
        md.someField = 'SomeValue'";

return $em->createQuery( $dql )->getResult();

  • Obwohl diese Antwort keine erforderlichen Details enthält, gibt es nichts zu zitieren, da die Dokumentation von Doctrine diese Arten von Verknüpfungen vollständig nicht abdeckt. Das hat bei mir funktioniert. Ich kenne genug SQL, um zu analysieren, was beabsichtigt war, und nicht genug Doktrin, um die Punkte zu verbinden.

    – Eierspeisen

    27. Juli 2016 um 16:31 Uhr

Ein DQL-Join funktioniert nur, wenn in Ihrem Mapping eine Zuordnung definiert ist. In Ihrem Fall würde ich sagen, dass es viel einfacher ist, eine native Abfrage durchzuführen und zu verwenden ResultSetMapping um Ihre Objekte zu füllen.

1287870cookie-checkSymfony 2: INNER JOIN bei nicht verwandten Tabellen mit Doktrin-Abfrage-Builder

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy