Native SQL-Anfragen in Doctrine / Symfony2

Ich bin jetzt schon seit längerem ein großer Fan von Symfony 2 und verwende Doctrine als ORM. Das klappt alles super, manchmal muss man sich aber in die Grenzgebiete wagen.

Im vorliegenden Fall ging es um Statistikwerte in einer Tabelle. Im wesentlichen besteht die Tabelle (neben einer ID) noch aus einem Timestamp und um einen Wert, der im aktuelle Fall immer zwischen 1 und 3 liegt und eine Bewertung darstellt. Die Tabelle selbst wird auch in einer Entität abgebildet folgende einfache Query sollte aber nun umgesetzt werden:

SELECT DATE(created_at), rating, COUNT(rating) 
FROM ratings 
GROUP BY DATE(created_at), rating 
ORDER BY DATE(created_at) ASC, rating ASC;

Damit wollte ich also eine Zeitreihe erhalten, die neben dem Datum noch enthält, wie häufig die entsprechende Bewertung an dem Tag vorkam.

Hierzu musste ich auf die NativeQuery von Doctrine zurückgreifen. Die Ergebnisse werden aber trotzdem von Doctrine verwaltet und verlangen ein ResultSetMapping, damit Doctrine weiß, wie die Ergebnisdaten umgesetzt werden sollen. Damit lässt sich zum Beispiel bewerkstelligen, dass Doctrine automatisch passende Objekte zurückgibt, die die Daten enthalten.

In meinem Fall wollte ich aber nur die nackten Zahlen haben, da ich die Werte zur späteren Visualisierung in JS eh noch einmal umschreiben muss. Den Code habe ich in einem EntityRepository gekapselt, wer einen ähnlichen Code in einem Service oder einer Controller-Action verwenden will, muss sich ggf. anderweitig den EntityManager besorgen. So sieht der Code aus:

$rsm = new \Doctrine\ORM\Query\ResultSetMapping();
$rsm->addEntityResult('CfMainBundle:Rating', 'r');
$rsm->addScalarResult('dateCreatedAt', 'date');
$rsm->addScalarResult('rating', 'rating');
$rsm->addScalarResult('countRating', 'count');
$data = $this->getEntityManager()
    ->createNativeQuery(
        'SELECT DATE(r.created_at) AS dateCreatedAt, r.rating, COUNT(r.rating) AS countRating
          FROM ratings r
          GROUP BY DATE(r.created_at), r.rating
          ORDER BY DATE(r.created_at) ASC, rating ASC',
         $rsm
    )
    ->getResult();

Das Ergebnisarray sieht so aus:

Array
(
    [0] => Array
        (
            [date] => 2013-01-05
            [rating] => 1
            [count] => 8
        )

    [1] => Array
        (
            [date] => 2013-01-05
            [rating] => 2
            [count] => 4
        )

    [2] => Array
        (
            [date] => 2013-01-05
            [rating] => 3
            [count] => 1
        )

    [3] => Array
        (
            [date] => 2013-01-07
            [rating] => 1
            [count] => 22
        )
...
)

Damit kann man nun prima weiterarbeiten. Zu beachten ist, dass in der Query die Originalnamen der Spalten aus der Datenbank genutzt werden müssen und nicht die Namen der gemappten Attribute aus der Entität. Dazu gibt es auch eine Abhilfe, die in der Doctrine-Dokumentation zur NativeQuery erklärt wird.

Belly Off 3 – Startschuss

(Nach der 1. Woche », Nach der 2. Woche »)

In Zeiten der Nudeldicken Deern ist es gar nicht so einfach, sich für so ein Projekt wie Belly Off 3 durchzuringen.

Und so lüge ich mir selbst in die Tasche und sage mir, dass ich in erster Linie meine Lebens- und Essgewohnheiten ändern will und das Gewicht (und der Bauch!) gar keine so große (haha!) Rolle spielen.

Ich mag „künstlichen“ Sport nicht. Dazu zählt jede Aktivität im Fitnessstudio und leider auch meine Rudermaschine zuhause. Wenn ich Laufen, Radfahren oder Rudern will, dann will ich dabei verdammt noch mal auch irgendeine Strecke zurücklegen – was sehen.

Zum Glück gehe ich sehr gerne Spazieren, bei Städtereisen auch gerne so lange bis mir nach ein paar Tagen die Füße so weh tun, dass ich dann doch auf die öffentlichen Verkehrsmittel zurückgreife. Aber immerhin ist das eine Form der Bewegung, die mich wirklich nicht viel Aufwand kostet und bei jedem Wetter durchzuführen ist.

Anfang 2012 wohnte ich noch in Köln und musste morgens erst mal knapp 10 Minuten zu Fuß zur Stadtbahn. Das habe ich dann so ausgeweitet, dass ich morgens 40 Minuten zur übernächsten Station zu Fuß ging – und abends genau umgekehrt. Das war schon sehr gut! Mit dem Umzug nach Bonn wurden die 2 x 40 Minuten Fußweg täglich durch 2 x 15 Minuten Fahrradfahren (zum Büro) abgelöst. Auch nicht verkehrt.

Hier in Schweden sitze ich aber im Homeoffice, es gibt keinen Grund für mich zu Fuß unterwegs zu sein. Und im Dezember in Bonn war ich auch nicht mehr mit dem Fahrrad unterwegs. Seit ein paar Tagen gehe ich nun aber auch hier jeden Abend für mindestens 30 Minuten spazieren. Ich muss mir dafür einfach die Zeit nehmen.

Und dann ist da das Essen: mit ein wenig Stolz und peinlicher Berührtheit kann ich sagen, dass ich in den letzten 2 Wochen weder auf Pizza noch auf Cola so richtig Appetit hatte – wobei ich am Wochenende trotzdem mal wieder ein Pizza gegessen und Cola dazu getrunken habe. Aber ich glaube, ich bin jetzt erst mal in der Pizza- und Cola-freien Zone angekommen. Das finde ich super!

Der Appetit auf Burger (von MAX) ist nach wie vor da, bisher habe ich mich aber zurückhalten können. Das liegt sicherlich daran, dass ich erst mal 30 Minuten mit dem Auto unterwegs sein müsste, um den nächsten MAX zu erreichen… In Bonn sind die nächsten McDonalds und BurgerKing leider nicht so weit weg, aber zum Glück auch nicht so lecker.

Ich will mir ja auch nicht jeden Genuss verbieten, aber zum einen ist viel auch Gewohnheit und gerade bei Burgern ist das eh so eine Sache: ich bin eigentlich kein großer Fan von Pommes und trotzdem bestellt man immer das Menü und isst dann natürlich auch Pommes dazu. Und ja: Cola gehörte für mich bisher immer zu einem Burger dazu. Ich werde aber mal versuchen, diese Gewohnheit zu ändern und nur einen Burger bestellen und dazu Sprudelwasser – trinke ich auch sehr gerne und eigentlich auch zu jeder Gelegenheit. So wie andere Leute Kaffee zum Frühstück oder Kuchen essen, gab es bei mir immer Sprudelwasser, da ich Kaffee nicht so viel abgewinnen kann.

Und noch zwei Dinge zu Gewohnheiten: als Jugendlicher mochte ich eine bestimmte Tiefkühllasagne für mein Leben gern. Wenn ich die Wahl hatte, was ich essen wollte, hab es diese Lasagne. Es gab einfach nichts besseres. Und dann war ich irgendwann mal krank – eine gewöhnliche Erkältung, meine ich – und nach dieser Woche hatte ich einfach keinen Appetit mehr auf die Lasagne. Ich habe sie danach noch mal probiert, aber so richtig gut schmeckte sie nicht mehr. Ich habe keine Ahnung, warum das so war, aber seitdem ist mir bewusst geworden, dass meine Essensgewohnheiten wirklich nur das sind: Gewohnheiten.

Der andere Punkt betrifft dann eher wieder dieses Projekt hier: Belly Off. Mit 20 Jahren wog ich bei identischer Körpergröße (ach was!) gut 25 kg weniger. OK, die damals 76 kg bei 1,85 cm waren schon eher an der unteren Grenze, aber der Leistungssport kostete einfach unheimlich viele Kalorien. Im Schnitt habe ich seitdem ein wenig mehr als 1 kg pro Jahr zugenommen. Und auch im Rückblick kann ich nicht wirklich sagen, dass in einem bestimmten Jahr die Kilos nur so dazugekommen sind. Es wäre nun also illusorisch zu glauben, dass sich innerhalb der nächsten 12 Wochen groß etwas ändern könnte. Das Ziel sollten eher die nächsten 5 Jahre sein. Und da will ich einfach nicht auf irgendetwas verzichten, auf das ich in dem Moment Hunger habe. Oder bei einer Grillparty irgendwelche Nudelsalate verschmähen, nur weil die evtl. zu viel Mayonnaise beinhalten könnten. Das wäre eine sehr düstere Zukunft.

Vielmehr will ich meine Ernährung und meine Bewegung meiner Lebenssituation anpassen. Es macht mich krank darüber nachzudenken, wie wenig man sich eigentlich körperlich bewegt, wenn man einen Bürojob hat. Das muss einfach ausgeglichen werden. Und was das Essen angeht: hier muss ich einfach besser den Unterschied zwischen Hunger und Appetit herausfinden und mich nach Alternativen für den Appetit umsehen. Ich bin leider kein großer Obstfreund, aber seit zwei Wochen habe ich angefangen Tee zu trinken (ohne Zucker oder Milch). Das scheint auch schon mal ganz gut zu funktionieren.

Zum Schluß noch das geforderte Foto und das offizielle Startgewicht: 101 kg

bof3

Weitere Teilnehmer (wird im Laufe des Tages ergänzt):
MC Winkel, Jan, Dirk Steins, Uli, Marco, Natascha, Mathis, Fairy, Sebastian Michalke, Lomomo, Jan, riboerny, Maik, Guddy, ilovechaos, Mokkaauge, Petra, Stefan, Matthias, Anni, Rebecca, Marco, derby, Rap’n Blues, Nille, Matzel, shadow, mocca, Hermann, Lenny_und_Karl, Oliver, chliitierchnuebler, Tyler, Antje, RA Schmenger, Kaal, Carsten und Thomas, Mina, Michelle, Caro, Frau K., gelrueb, SAN, Flyerzwomille, Andreas, Nebelfrosch, Hucki, Julia, Dr. Sheldon Harper, Thomas, dentaku, Steffi, Mark Olan, Kai, Matze, Mary Malloy, Ulrike, Gürtel, Stiller, Nicole, Corinna, Frances Ligeia, Frank, Tobias Kraus