Mittwoch, 19. November 2008


Artikel

September 2007 | Artikel

Kuchen backen! Fortsetzung, Teil 3

(Link zum Artikel: http://www.entwickler.com/php//001295)
Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   

Generierter Quellcode: Modell
Weil bake dank den Einstellungen in database.php weiß, wie unsere DB-Struktur aussieht, kann es auch passende Vorschläge geben. Es fragt nach Wunsch für jedes Feld, welche Validierungskriterien wir anwenden wollen und welche Assoziationen zwischen den Tabellen bestehen. Bei unserem Beispiel müssen wir einzig die Assoziation hasMany für das Modell Feed anwählen, die ausdrückt, dass ein Feed viele Feed-Einträge besitzt. Analog dazu, setzen wir beim Modell FeedItem eine belongsTo-Verbindung zu Feed.

Mögliche Assoziationstypen zwischen Modellen
  • hasOne: 1:1-Relation
  • hasMany: 1:n-Relation
  • belongsTo: Relation ausgehend von der Kind-Tabelle, z.B. ein Kommentar unter vielen gehört zu einem Blog-Post
  • hasOneAndBelongsToMany (HBTM): n:m-Relation, bei Verbindungen in der Art von “Tags zu Artikeln”
Das Produkt unserer ersten Back-Sitzungen finden wir im Ordner /cake/app/models/ – die Namensgebung folgt den CakePHP-Konventionen – feed.php für die Klasse Feed und feed_item.php für FeedItem. Werfen wir einen Blick in die Datei /app/models/feed.php, die in Listing 3 einsehbar ist:
  1. <?php
  2. class Feed extends AppModel {
  3. var $name = 'Feed';
  4. var $hasMany = array(
  5. 'FeedItem' =>
  6. array('className' => 'FeedItem',
  7. 'foreignKey' => 'feed_id',
  8. 'conditions' => '',
  9. 'fields' => '',
  10. 'order' => '',
  11. 'limit' => '',
  12. 'offset' => '',
  13. 'dependent' => true,
  14. 'exclusive' => '',
  15. 'finderQuery' => '',
  16. 'counterQuery' => ''
  17. ),
  18. );
  19. }
  20. ?>
Die Klasse Feed erbt von AppModel, einer CakePHP-Klasse, und enthält nur zwei Variablen: , mit dem Namen der Modellklasse und die von uns gewünschte Assoziation . Die hier möglichen Parameter sind von bake präventiv eingefügt worden. Uns interessiert der Schlüssel dependent, den wir auf true (boolean, nicht string!) setzen. Das bringt CakePHP dazu, beim Löschen eines Feed-Eintrags alle dazu gehörenden FeedItems zu löschen. Wie man vielleicht erkennt, ist es möglich, maßgeschneiderte Assoziationen vorzubereiten, welche eine Sortierordnung, limitierte Anzahl an Resultaten, spezielle Filterkriterien, Felder und so weiter enthalten können.

Listing 4: Objekt für das Modell FeedItem
  1. <?php
  2. class FeedItem extends AppModel {
  3. var $name = 'FeedItem';
  4. var $belongsTo = array(
  5. 'Feed' =>
  6. array('className' => 'Feed',
  7. 'foreignKey' => 'feed_id',
  8. 'conditions' => '',
  9. 'fields' => '',
  10. 'order' => '',
  11. 'counterCache' => ''
  12. ),
  13. );
  14. }
Listing 4 zeigt die Datei /app/models/feed_item.php an. Wie bei feed.php findet hier die Assoziation als Array statt, diesmal aber wird die Variable gesetzt. Das Modell ist somit komplett. Gehen wir nun ans Generieren der Controller und starten erneut bake.php!
  1. http://www.cakephp.org
  2. http://bakery.cakephp.org
  3. http://pear.php.net/manual/de/package.xml.xml-rss.php
  4. http://bakery.cakephp.org/categories/view/4
  5. http://groups.google.ch/group/cake-php/web/cake-apps-sites-in-the-wild
  6. http://www.cakefoundation.org/pages/certification

Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   

Kommentare