Ich arbeite an Symfony 3.2 und ich versuche, eine "einfache" Abfrage zu tun. Dies ist die SQL-Version der Abfrage, die (getestet direkt in PHPmyAdmin)Symfony & Doctrine: DQL Max() mit groupBy
SELECT s.*
FROM pl_statsheet s
INNER JOIN (
SELECT day, MAX(points) AS points
FROM pl_statsheet
GROUP BY day
) ps
ON s.day = ps.day AND s.points = ps.points
Unfortunelty funktioniert, kann ich nicht "convert" es mit Symfony zu arbeiten. Würde mich bitte etwas Hilfe schätzen. Das habe ich bisher gemacht. In meinem Repository
$query = $this->getEntityManager()
->createQuery(
'SELECT s
FROM PlayoffBundle:Statsheet s
INNER JOIN (
SELECT day, MAX(points) AS points
FROM PlayoffBundle:Statsheet
GROUP BY day
) AS ps
ON s.day = ps.day AND s.points = ps.points'
)
->getResult();
und das ist der Fehler Symfony gibt
QueryException: [Semantical Error] line 0, col 55 near '( SELECT': Error: Class '(' is not defined.
Vielen Dank für jede Hilfe. Ich bin noch ein Anfänger mit Symfony;)
aktualisieren.
Da bin ich nicht konform mit nativem SQL. Ich entschied mich, dies in 2 Abfragen zu tun. 1/Mit nativem SQL erhalte ich die IDs mit den max (Punkten) 2/Mit ORM, mache ich nur eine findById ($ arrayIDs). Doing so, weil ich ManyToMany Beziehungen habe und es ist einfacher für mich, die vollständigen Daten zu erhalten
es also fast funktioniert, aber aus einem Grunde kann ich nicht undestand, meine zweite Abfrage gibt null wie folgt aus:
Statsheet {#968 ▼
-id: 20
-stats: null
-points: null
-day: null
-player: null
-game: null
}
Also habe ich ein paar Tests gemacht. Ich weiß, dass ID 20 ist ein Maximalwert
Zum Beispiel dieses:
dump($em->getRepository('PlayoffBundle:Statsheet')->find(19));
-> werden alle die Daten korrekt geben.
dump($em->getRepository('PlayoffBundle:Statsheet')->find(20));
-> geben wird, was ich geschrieben nur ein paar Zeilen weiter oben (null überall für id exept)
Aber wenn ich einen tun -> find (20) vor dem NativeSQL es gibt mir die Daten korrekt.
Ich weiß nicht, ob meine Erklärung klar genug ist. Bei Bedarf kann ich einen Screenshot der dump() Nachrichten und des Codes meines Controllers/Repository/Entity bereitstellen.
StatsheetRepository.php
public function getBestPickId()
{
$sql = 'SELECT s.* FROM pl_statsheet s INNER JOIN (SELECT day, MAX(points) AS points FROM pl_statsheet GROUP BY day) ps ON s.day = ps.day AND s.points = ps.points';
$rsm = new ResultSetMapping;
$rsm->addEntityResult('PlayoffBundle:Statsheet', 's');
$rsm->addFieldResult('s', 'id', 'id');
$query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
$picks = $query->getResult();
foreach($picks as $pick){
$ids[] = $pick->getId();
}
return $ids;
}
Und das ist mein Controller
$bestpicksIds = $em->getRepository('PlayoffBundle:Statsheet')->getBestPickId();
$bestpicks = $em->getRepository('PlayoffBundle:Statsheet')->findById($bestpicksIds);
dump($em->getRepository('PlayoffBundle:Statsheet')->find(20));
dump($em->getRepository('PlayoffBundle:Statsheet')->find(19));
dump($bestpicks);
mich so schnell erklären lassen. ID 19 ist keine gute Wahl, aber 20 ist. Also gibt das -> find (19) alle benötigten Daten aber -> find (20) und dump ($ bestpicks) gibt nur die IDs und der Rest der Daten ist NULL Hier ist was mein Code jetzt tut (vielleicht hilft es zu verstehen): Dump Symfony
Ich weiß, dass das Problem von der nativen SQL-Abfrage kommt.Ich weiß nicht, warum es meine nächste Frage betrifft. Das ist also für das Update meiner Situation. Ich weiß, was zu beheben und hoffentlich werde ich mit der Lösung kommen Sie bald wieder;)
Ich möchte nur hinzufügen, dass ich durch meine nativeSQL abgeschlossen haben das Hinzufügen dieser Zeilen:
$rsm->addFieldResult('s', 'points', 'points');
$rsm->addFieldResult('s', 'stats', 'stats');
$rsm->addFieldResult('s', 'day', 'day');
aber das doesn Bisher scheint es nicht zu funktionieren, mit einem fremden Schlüssel wie dem Spiel $ rsm-> addMetaResult ('s', 'game_id', 'game');
Noch arbeiten daran.
Danke! Ich ging für die Native SQL-Methode, da alle mein Projekt bereits ORM verwendet. Ich habe es funktioniert, aber ich habe ein Problem mit dem Ergebnis meiner nächsten Abfrage. Ich werde meine Hauptnachricht mit weiteren Informationen bearbeiten. –
Vielleicht können Sie den Code, der native Abfragen verwendet hinzufügen –
Hallo, sry für keine Antwort früher, aber ich war in den letzten paar Tagen. Also habe ich herausgefunden, wo das Problem liegt. Da ich nur versuchte, die "ID" mit meinem nativen SQL zu bekommen, sagt es Symfony irgendwie, die ID nur für die nächste Anfrage zu nehmen. (Nicht sicher, was du sagst.) Wie auch immer. Ich habe das behoben, indem ich die ganze Zeile im nativen SQL auswähle. Ich werde die Nachricht so schnell wie möglich aktualisieren –