Belly Off 3 – Ende der ersten Woche

Heute vor einer Woche fing Belly Off 3 an, es wird Zeit für den ersten Zwischenbericht.

Laut Waage habe ich gegenüber dem Anfangsgewicht 2kg verloren. Das hört sich ganz gut an, ist aber sicherlich nur eine Momentaufnahme und enthält ein gutes Stück Messungenauigkeit. Was habe ich diese Woche anders gemacht? Eigentlich habe ich nur das fortgeführt, was ich mir am 30. Dezember (meine Ankunft hier in Schweden) vorgenommen hatte: keine Süßigkeiten, keine Cola, keine Pizza, mehr Bewegung.

Wobei das „keine Süßigkeiten“ auch in der letzten Woche wieder nicht funktioniert hat. Ich will Süßigkeiten ja auch gar nicht per se verteufeln, mir fällt es aber schwer, den Süßigkeitenkonsum zu reglementieren. Wenn hier eine Tafel Schokolade rumliegt, hält die kaum länger als einen Tag. Und so argumentiere ich dann mit mir zwischen „Du sollst Dich ja auch wohlfühlen“ und „aber hinterher bereust Du es“ hin und her und mache es dann so wie mit all meinen anderen Entscheidungen auch: das Bauchgefühl gewinnt (hier im doppelten Sinne) und ich esse die Schokolade so, wie es mir gefällt.

Auch in der letzten Woche habe ich eine Pizza gegessen (natürlich diese Tiefkühldinger), aber ich glaube, so langsam komme ich wirklich ab davon. Genauso wie von Cola. Dieser Heißhunger darauf ist fast komplett verschwunden. Ich muss nur mal schauen, womit ich mich dann in Zukunft „belohne“, oder besser gesagt: wie ich die Besonderheit des Wochenende zelebriere. Am letzten Wochenende kam zur Pizza noch ein Burger von MAX hinzu. Das volle Programm mit Käse, Bacon, Pommes und Cola. Aber ich bereue nix!

Die allabendlichen Spaziergänge von 30-45 Minuten habe ich durchgehalten, auch bei -12 Grad. Spazierengehen im Schnee ist einfach super. Mal sehen, wie das dann mal im stömenden Regen wird.

Am Wochenende habe ich mir ausserdem noch die App zu 100 Push-Ups / 100 Liegestütze heruntergeladen und den initialen Test gemacht. Sehr lahme 7 Stück sind dabei herausgekommen und gestern stand der erste Übungstag an (ich mache das jetzt montags, mittwochs, freitags). Wobei ich mal gespannt bin, wie ich das morgen schaffen werde. Meine Schulter sendet seit gestern komische Signale zwischen Muskelkater und totaler Unzufriedenheit aus.

Die App zu 200 Sit-Ups habe ich mir auch schon mal besorgt. Hier befürchte ich, dass der initiale Test noch deprimierender ausfallen wird. Ich muss mir aber auch noch die Anleitung dazu genau durchlesen. Also ob es z.B. erlaubt ist, die Füße einzuklemmen, oder ob die Sit-Ups komplett ohne Hilfestellung gemacht werden müssen.

Allen anderen Teilnehmern viel Erfolg!

Uli, Sebastian, MC Winkel, Mathis, Dirk Steins, ilovechaos, Antje, Natascha, Mary Malloy, Stefan, Anni, Lomomo, Guddy, Tyler, Rap’n Blues, Kaal, Corinna, Jan, chliitierchnuebler, Marco, riboerny, Sabrina, gelrueb, Frau K., Rachel, Jan, Thomas

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.