06 Jul
Posted by dirk.olbertz as Uncategorized
Statt sich mit find() Anweisungen herumzuschlagen, passiert es gerade Anfängern immer wieder, dass sie statt dessen lieber direkt ein SQL-Statement mittels query() oder execute() ausführen.
Das solltet ihr aber wirklich nicht tun!
Mit einem Kollegen hatte ich darüber viele Diskussionen, weil ich auch lieber direkt das SQL angegeben habe, aber dann brachte er irgendwann das ultimative Argument:
Du umgehst damit
beforeFind()undafterFind()!
Das war’s. Das ultimative Argument. Denn er hat Recht.
Stellt euch vor, dass ihr in afterFind() eines Models die gefundenen Daten zusätzlich anreichert. Sei es ein einfaches name, welches sich aus Vor- und Nachname zusammensetzt, oder andere, beliebig komplexe Dinge.
Wenn ihr nun mittels query() Daten aus diesem Model holt, fehlen die zusätzlichen Felder. Die Folge wird sein, dass euer Code Fehler produziert.
Macht euch also lieber die Arbeit und setzt euch mit find() auseinander. Dabei lernt ihr nicht nur eine Menge über CakePHP, sondern habt im Ergebnis auch besser wartbaren Code.
4 Responses
Daniel Hofstetter
Juli 6th, 2009 at 1:46
1Nun ja, so pauschal würde ich das nicht sagen. Gerade bei komplexeren SQL-Abfragen ist es vielfach einfacher und verständlicher, direkt SQL (mit query()) zu verwenden. Und wenn du dies in einer Methode in deinem Model kapselst, dann rufst du einfach die Methoden auf, die sonst aus beforeFind()/afterFind() aufgerufen würden.
dirk.olbertz
Juli 6th, 2009 at 2:31
2Was aber, wenn Du im beforeFind() die Abfrage selbst beeinflusst. Zum Beispiel weil Du ein Flag “deleted” in der Datenbank hast und dies im beforeFind() abhängig von den Rechten des Users setzt?
Wenn Du diese Funktionalität erst einbaust, nachdem Du Deinen query()-Aufruf bereits gemacht hast, kannst Du unerwünschte Effekte erhalten.
Wenn Deine Abfrage aber nur durch find() realisiert wird, hast Du das Problem nicht mehr.
(Ich weiß, dass ich in NoseRub auch noch query() benutze, will das aber so schnell wie möglich loswerden, wenn ich erst einmal die HABTM-Beziehung dort vernünftig gelöst habe…)
Timo Derstappen
Juli 6th, 2009 at 4:24
3Hey Dirk, schön dass du den Blog wieder belebt hast! Und noch schöner, dass query aus deinem Cake Wortschatz verschwindet :)
Mit query zerstört man auch so gut wie alle Behaviors …
Daniel Hofstetter
Juli 7th, 2009 at 4:44
4Ja, das ist das Risiko, wenn du query() und Callback-Methoden verwendest (wobei ich persönlich sehr selten die Callback-Methoden verwende). Auf der anderen Seite kann es auch sein, dass du plötzlich ein SQL-Statement ausführen musst, welches du nicht mit find() abbilden kannst, und dann hast du ebenso ein Problem…
RSS feed for comments on this post · TrackBack URI
Leave a reply
Letzte Kommentare
Links
Kategorien
Meta
Cake Bakery is proudly powered by WordPress - BloggingPro theme by: Design Disease