2016-05-13 4 views
0

Ich weiß, diese Frage ein Klischee hat worden, aber es gab keine Antworten darüber, wie dies mit Lehre zu lösen:Finden die Summe und die Gruppierung der aus dem db geholten Daten Monat wiese

so hier ist meine Lehre Abfrage von Abrufen Zeitstempel und Menge aus der Tabelle:

$q = $repo->createQueryBuilder('s') 
      ->select('s.timestamp','s.amt') 
      ->where('s.disId=:id') 
      ->setParameter('id', $cid) 
      ->getQuery() 
      ->getArrayResult(); 

derzeit alle einzelnen Zeilen aus der Tabelle ich holen, möchte ich die Ausgabe entsprechend amt (Betrag) Monat weise und Datensatz angezeigt zusammenzufassen.

Danke für Ihre Hilfe

Antwort

1

Wenn Sie das Datum als Zeitstempel gespeichert wird, dann kann es nicht direkt zu tun, weil Lehre ORM derzeit keine Funktionen wie Mysql Monat() unterstützen, die Sie in GROUP verwenden müssen Klausel. Mögliche Lösungen:

  1. Bündel installieren, die diese Funktionen ergänzt, zum Beispiel https://github.com/beberlei/DoctrineExtensions und verwenden functitons MONAT() und FROM_UNIXTIME() von dort

  2. nativen Abfrage Use Doctrine: http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/native-sql.html

  3. Verwenden Sie DBAL-Schicht der Doktrin: http://doctrine-orm.readthedocs.io/projects/doctrine-dbal/en/latest/

Für Sie einfachsten wäre wahrscheinlich die Option 3 könnte Code so etwas wie:

$em = $this->get("doctrine")->getManager(); 
$conn = $em->getConnection(); 
$sql = "SELECT MONTH(FROM_UNIXTIME(s.timestamp)) as mon, SUM(s.amt) as total FROM tablename s WHERE s.dis_id = ? GROUP BY MONTH(FROM_UNIXTIME(s.timestamp)) ORDER BY 1"; 
$stmt = $conn->prepare($sql); 
$stmt->bindValue(1, $cid); 
$stmt->execute(); 
$all_rows = $stmt->fetchAll(); 
foreach ($all_rows as $row) { 
    echo "Month: {$row["mon"]}, Total: {$row["total"]} \n"; 
} 
+0

Persönlich bevorzugen Option 1, danke für das Posten mehrerer Lösungen! – kero

+0

Es gibt ein Null-Array zurück! die Ausgabe war: [] –

+0

habe ich einen Fehler bei der Installation des Bundles gemacht? –

0

try this:

$q = $repo->createQueryBuilder('s') 
     ->select('s.timestamp','sum(s.amt)') 
     ->where('s.disId=:id') 
     ->groupBy('s.month')//your month field name of database 
     ->setParameter('id', $cid) 
     ->getQuery() 
     ->getArrayResult(); 

Durch groupBy verwenden Sie Ergebnis.

Verwandte Themen