Doktrin dql where-Klausel Interpretation mit assoziierten Entität

8

Gegeben diese Entität

%Vor%

... und dieses dql

%Vor%

... Ich hoffe, "die SystemRecords für den Benutzer mit der angegebenen Seriennummer zu bekommen, aber nur diejenigen mit dem aktuellsten Datum aus irgendeinem SystemRecord". Mit anderen Worten, prozedural "findet das letzte Datum eines beliebigen SystemRecord für jeden Benutzer. Suchen Sie dann nach Datensätzen für den angegebenen Benutzer, die an diesem Datum aufgetreten sind."

Wenn ich SQL schreiben würde, würde ich

schreiben %Vor%

Aber, Lehre gibt mir das folgende sql

%Vor%

Was ich nicht will. Das gibt mir "SystemRecords für alle Benutzer, deren SystemRecords das gleiche Datum haben wie die letzten SystemRecords für den Benutzer mit der angegebenen Seriennummer".

Wie formuliere ich meine Abfrage mit dql?

goat 04.05.2015, 19:00
quelle

2 Antworten

2

Wenn ich Sie richtig verstehe, müssen Sie eine Unterabfrage wie Sie verwenden, aber ich denke, dass Sie den in -Ausdruck vermissen. Mit QueryBuilder würden Sie die Abfrage erstellen, um Ihr Ergebnis wie folgt zu erhalten (ich schreibe immer meine Abfragen mit QueryBuilder ):

%Vor%

Diese Antwort basiert auf diese Antwort auf ähnliche Frage auf Stapel < stark> Überlauf .

BEARBEITEN:

Wenn Sie wirklich DQL wollen, dann können Sie es leicht von Ihrer QueryBuilder -Instanz nach dem Erstellen der Abfrage mit der Methode getDQL wie folgt erhalten:

%Vor%     
Wilt 20.05.2015, 07:49
quelle
1

Ich konnte mein Problem lösen / vermeiden, indem ich eine Verknüpfung vermeide

%Vor%

Ergebnis sql (korrekt)

%Vor%

Der entscheidende Unterschied ist, dass ich die ID für die verknüpfte Entität nicht angeben muss (via u.serial = :serial ), sondern jetzt die Entity selbst (via r.user = :user ). Dadurch kann ich auch die Verknüpfung weglassen. Das serial -Feld ist mit @ORM\Id in meiner User -Entität markiert.

Dies vermeidet jedoch nur das Problem. Ich bin immer noch verblüfft darüber, wie die Doktrin die Abfrage interpretiert, wenn ein Join vorhanden ist.

Bearbeiten - echte Lösung gefunden

Dank Wilt habe ich nach der Verwendung des Abfrage-Generators und der Verwendung der Methode getDQL () das fehlende Detail gefunden. Die Arbeits-dql ist

%Vor%

Beachten Sie, dass der Unterschied zwischen dem DQL in meiner ursprünglichen Frage und dieser Arbeitslösung join Application\Entity\User u vs join r.user u ist.

    
goat 04.05.2015 23:05
quelle

Tags und Links