Die Relationen bei CakePHp Models sind ein grundlegendes Feature und definieren, wie Models untereinander verbunden sind.
Sämtliche find-Methoden aus Cake (auch findCount() und read()) benutzen diese Informationen, um verbundenen Models zu holen. Grundsätzlich eine prima Sache, aber bei komplexeren Datenstrukturen und Rekursionslevel von 2, kann da ein einfaches find() ganz schön viel Daten zurückliefern.
In der Praxis behilft man sich dann meistens mit unbindModel() und bindModel(). Hat man in seinen Models alle Relationen aufgeführt, benutzt man vor jedem find() ein unbindModel() um überflüssige Models zu entfernen. Der andere Weg wäre, die Relationen im Model ganz weg zu lassen und dann jeweils gezielt mit bindModel zu spezifizieren, welche Models benötigt werden.
Letzeres ist aber nicht wirklich erstrebenswert, weil damit in der Applikationslogik verborgen ist, wie die Models untereinander verbunden sind. Bliebe also nur, die unnötigen Models vor einem find() mit unbindModel() zu entfernen. Das ist aber dann problematisch, wenn in die Applikation immer mal wieder neue Models und Relationen eingepflegt werden. Denn dann müsste man diese neuen Relationen bei Bedarf (bzw. Nicht-Bedarf) in den unbindModel()-Aufrufen ebenfalls nachpflegen.
Alles in allem also irgendwie ziemlich unbefriedigend. Das hat sich auch Mariano Iglesias gedacht und expects() erdacht. Mit expects() hat man die Möglichkeit genau zu spezifizieren, welche Models beim nachfolgenden find() geholt werden sollen. Es ist damit nur eine andere Notation für bindModel() und undbindModel(). Aber wesentlich einfacher gehalten, da in den Models weiterhin die Art der Relation (belongsTo, hasMany, etc.) spezifiziert wird und mittels expects() nur noch die in der Rückgabe erwarteten Models spezifiziert werden.
expects() wird im AppModel eingefügt, man bleibt damit also unabhängig von CakePHP selbst, was einem regelmäßige Updates von CakePHP erleichtert.
Bei oben verlinktem Beitrag zu expects() sollte man unbedingt auch die Kommentare lesen, weil sie noch ein paar wichtige Fragen und Hinweise enthalten.
4 Responses
Frank Helmschrott
Februar 16th, 2007 at 2:07
1Danke Dirk – gut zu wissen.
Die Problematik mit den unbind()s wäre mir spontan nicht aufgefallen.
caffeine
Juli 30th, 2007 at 10:09
2… und wenn es mal schnell gehen muss und man einfach gar keine Models die in Beziehung stehen mit abrufen will kann man auch etwa bei findAll im letzten Parameter einstellen:
http://api.cakephp.org/1.2/class_model.html#63ade7d3c6d03c83ab53a224e23ad9dd
Dirk Olbertz
August 1st, 2007 at 8:07
3Der Parameter setzt aber nur recursive auf den angegeben Wert. Das reicht aber nicht immer aus. Gerade wenn man einige Relationen zu anderen Modellen hat, werden dann trotzdem JOINs auf der Datenbank gemacht, obwohl im Endeffekt nichts geholt wird. Es kann sein, dass die DB das eh weg-optimiert, aber ich gehe da lieber auf Nummer sicher.
Außerdem kann man bei findCount() so auch seltsame Ergebnisse bekommen, weil da nämlich bei recursive=0 auch die JOINs gemacht werden und je nach Konstellation nicht alle Einträge in der Modeltabelle gefunden werden.
findCount() und belongsTo « Cake Bakery
Juli 6th, 2009 at 11:04
4[...] Cake Bakery Rezepte für die Entwicklung mit CakePHP « Fallstricke bei den Model-Relationen [...]
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