2016-12-17 12 views
1

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.

Antwort

0

Diese Art von Abfragen wird in DQL nicht funktionieren.

Sie haben ein paar Möglichkeiten:

a) verwenden Doctrine DBAL statt ORM. DBAL ist fast identisch mit der Arbeit mit vorbereiteten mysql-Anweisungen. Ergebnisse kommen in Arrays und nicht in Objekten wie bei ORM.

b) Verwenden Sie Native SQL, wo Sie die Entitäten und Eigenschaften definieren müssen, die manuell gefüllt werden.

+0

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. –

+0

Vielleicht können Sie den Code, der native Abfragen verwendet hinzufügen –

+0

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 –

Verwandte Themen