Berechnungen im Model oder Controller?

Fragen zur Konzeptionierung und womit man am besten anfäng? Hier rein...

Berechnungen im Model oder Controller?

Beitragvon mbrod am Mo 1. Jun 2009, 09:10

Hallo liebe Leute,

bin noch sehr damit beschäftigt meine Denkweise auf das MVC-Prinzip umzustellen. Und ich mag es gerne möglichst an einem konkreten Beispiel.
Daher mein Model: Wetterdaten (meteo_data).
Eine Auswahl der Felder: ID der Wetterstation (meteo_station_id), Datum (datum), Tagesmitteltemperatur (tm), Tageshöchsttemperatur (tx).
In Klammern habe ich die Felder in der Datenbank angegeben.

Nun gibt es ja durchaus Eigenschaften, die man dem Model zuweisen könnte, die nicht als fester Wert in der Datenbank stehen, sondern sich aus einer Berechnung der Daten ergeben. Z.B. Heißer Tag, Frosttag, Eistag. (Siehe dazu auch [url]http://de.wikipedia.org/wiki/Heißer_Tag[/url]).

Beispiel Eistag:
Code: Alles auswählen
if($tx<0){$Eistag=true;}
else{$Eistag=false;}

Beim Heiztag ist der Wert zudem noch von einer Benutzereingabe der Heizgrenze in einem Formular abhängig:
Code: Alles auswählen
if($tm<$Heizgrenze){$Heiztag=true;}
else{$Heiztag=false;}

Im Controller habe ich es geschafft das Problem zu lösen: Nach der Datenbankabfrage find() in einer foreach Schleife die Berechnungen vornehmen und die Ergebnisse dem Array hinzufügen. Dann das Array mit set() dem View übergeben.

Dieses Vorgehen finde ich allerdings nicht gerade elegant und erscheint mir auch nicht perfomant, da sowohl im Controller als auch im View eine foreach Schleife notwendig.

Gibt es eine Idee, wie man Berechnungen in das Model verlegt und als weitere Eigenschaft per find() dann abfragen kann?

Schönen Gruß

Michael
mbrod
 
Beiträge: 103
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.2
OS: Mac OS X

Re: Berechnungen im Model oder Controller?

Beitragvon euromark am Mo 1. Jun 2009, 10:05

ja sicher
das nutzen die behaviors z.b. aus

und zwar über
function afterFind() {}, die du in das Model einbauen kannst

einfach das array entsprechend mit weiteren Infos aufgrund deiner berechnungen füllen
euromark
 
Beiträge: 397
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 1.2.4
OS: Windows

Re: Berechnungen im Model oder Controller?

Beitragvon mbrod am Mi 3. Jun 2009, 00:47

Ja, danke für die rasche Antwort.
Aufgegriffen habe ich die Idee, die foreach Schleife statt im Controller durchzuführen, sie über eine Funktion im Model aufzurufen. Das scheint mir im Sinne des MVC-Prinzips zu liegen.

Allerdings ist mein Gedanke, dem Model Eigenschaften zuzuweisen, die sich aus Berechnungen anderer Felder ergeben, damit noch nicht verwirklicht. Vielleicht wird es an folgendem Beispiel deutlich:
Im Controller selektiere ich nur die Felder, die ich im View auch tatsächlich brauche:
Code: Alles auswählen
find('all', array('conditions'=>$conditions,'fields'=>array('datum','tagesmitteltemperatur','eistag')));

Das Feld 'eistag' existiert aber nicht in der Datenquelle, sondern muss berechnet werden. Mit einer SQL-Datenbank als Datenquelle könnte ich mir vorstellen, dass das Model ggf. folgende Abfrage formuliert:
Code: Alles auswählen
SELECT tageshoechsttemperatur<0 AS eistag FROM meteo_data

Wie kann ich im Model die Eigenschaft 'eistag' als Funktion 'tageshoechsttemperatur<0' definieren?
Kann es sein, dass es so etwas in cakephp (noch) nicht gibt?
mbrod
 
Beiträge: 103
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.2
OS: Mac OS X

Re: Berechnungen im Model oder Controller?

Beitragvon euromark am Mi 3. Jun 2009, 09:28

nein, sowas lässt sich nich so einfach umsetzen...

dann doch eher im controller "eistag" nicht definieren
und im model dann eben im AfterFind() hinzufügen, sofern das feld "tageshoechsttemperatur" aus der DB geholt wurde..
also mit isset()

dies ist zugleich auch viel flexibler
euromark
 
Beiträge: 397
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 1.2.4
OS: Windows

Re: Berechnungen im Model oder Controller?

Beitragvon mbrod am Sa 6. Feb 2010, 19:33

Gerade sehe ich, dass die CakePHP Entwickler in der Version 1.3 offensichtlich das verwirklicht haben, an was ich oben gedacht habe: virtual fields.
Siehe:http://cakephp.lighthouseapp.com/projects/42648/13-new-features-virtual-fields
mbrod
 
Beiträge: 103
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.2
OS: Mac OS X

Re: Berechnungen im Model oder Controller?

Beitragvon euromark am Sa 6. Feb 2010, 20:41

die neuen virtual fields sind primär erstmal zusammengesetzte felder
aber ja, man kann dies durchaus dazu verwenden

genauso wie eben die bisherigen multiple display field behaviors bisher!

allerdings ist das bei dir schon sehr spezielle logik und sollte daher in einem afterFind() callback stattfinden
euromark
 
Beiträge: 397
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 1.2.4
OS: Windows


Zurück zu Konzeption und Vorgehensweise

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron