Jan 31

Wer mit Doctrine arbeitet, der vermisst es ab und an, die Datenbankmanagement-System spezifischen SQL-Funktionen verwenden zu können, da diese nativ vom Doctrine-Query-Parser angemeckert werden, da sie nicht zum SQL-Standard gehören.

Jetzt hatte ich wieder den Fall, dass ich einen simplen Select hatte, in dem ich entscheiden mußte, ob ich das Datum der Einstellung oder das Datum der Aktualisierung des Datensatzes zum Sortieren benutze. Das verlangt einen Vergleich im Query, den man in SQL folgendermaßen abfangen kann:

1
SELECT i.*, IF(i.date_created > i.date_updated, i.date_created , date_updated) AS date_compare FROM item AS i ORDER BY date_compare

Das in einen Doctrine-Query gepackt sieht so aus:

1
2
3
4
5
$Query = new Doctrine_Query;
$Query->select ( 'i.*, IF(i.date_created > i.date_updated, i.date_created , date_updated) as date_compare' );
$Query->from ( 'Db_Item i' );
$Query->orderBy ( 'date_compare' );
$Result = $Query->execute(array(),Doctrine::FETCH_ARRAY);

Das so ausgeführt wirft eine Exception, weil Doctrine mit dem Funktionsaufruf IF nicht zurecht kommt, da sie nicht zum Standard gehört. Jetzt habe ich bisher immer einen Workarround gefunden, doch diesmal wollte ich mich damit nicht abgeben. Nach einiger Recherche kam ich auf ein Blog, welches sich um sfDoctrine dreht (das Symfony Plugin basierend auf Doctrine). Hier ist genau dieses Problem beschrieben und es wird eine Option beschrieben, mit der man beeinflussen kann, wie sehr der Doctrine Parser auf Kompatibilität zu anderen DBMS achtet.

Folgendes Beispiel funktioniert wie gewollt:

1
2
3
4
5
6
7
Doctrine_Manager::getInstance()
->setAttribute(Doctrine::ATTR_PORTABILITY, Doctrine::PORTABILITY_ALL ^ Doctrine::PORTABILITY_EXPR); 
$Query = new Doctrine_Query;
$Query->select ( 'i.*, IF(i.date_created > i.date_updated, i.date_created , date_updated) as date_compare' );
$Query->from ( 'Db_Item i' );
$Query->orderBy ( 'date_compare' );
$Result = $Query->execute(array(),Doctrine::FETCH_ARRAY);

Man kann also die Portability über das Entfernen des Flags PORTABILITY_EXPR beeinflussen und damit verlangen, dass der Doctrine-Query-Parser auf solche Dinge nicht mehr achtet. Da lohnt sich vielleicht sogar der Blick in den Source bzw. die Api-Doku, vielleicht finden sich ja noch mehr solche Einstellungen ;) .

Ich hoffe anderen damit helfen zu können, wie mir der Blog-Eintrag Symforc geholfen hat ;) .

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , , , , ,


Leave a Reply

i3Theme sponsored by Top 10 Web Hosting and Hosting in Colombia