Habtm Speichern – Minihilfe

22. Jan 2008

Es gibt nichts gemeineres als eine “Has-and-belongs-to-many-Association”. Gerade als Neu-Bäcker hat man damit oft Probleme. Aber auch als altgedienter CakePHP User hat man nicht immer auf Knopfdruck die entsprechende Befehlskette zur Hand, daher hier eine kleine Minihilfe, die euch (und auch mir) helfen sollte, falls mal wieder einfach nichts gespeichert werden will.

Ausgangssituation:

  • Tabelle1: Posts
  • Tabelle2: Tags
  • Posts hat und gehört zu vielen Tags (Jeder Post hat viele Tags, die wiederrum viele Posts haben)

Will man nun ein neues Tag an einem bestehenden Post speichern, das dann in Zukunft von anderen Posts auch benutzt werden kann, so legt man zusätzlich zu den Tabellen “posts” und “tags” eine Tabelle “posts_tags” mit den Werten id, post_id und tag_id an.
Ist dies geschehen, kommt bei der Verarbeitung des Tags im Controller folgendes noch dazu:

  1. function create($post_id = NULL) {
  2.    //Diese Zeile teilt Cake mit, dass es eine HABTM Speicherung durchführen soll
  3.    $this->data[‘Post’][‘Post’][] = $post_id;
  4.    //Es reicht, nur das Tag zu speichern
  5.    $this->Tag->save();

Möchte man mehrere Posts gleichzeit einem neuen Tag übergehen:

  1. function create($posts =array()) {
  2.    //Diesmal übergeben wir ein Array aus Post-Ids: array(1,2,3,4)
  3.    foreach($posts as $elem)
  4.       $this->data[‘Post’][‘Post’][] = $elem;
  5.    //Es reicht, nur das Tag zu speichern
  6.    $this->Tag->save();

Diese kleine Gedankenstützt hilft, viel Ärger und rumprobieren zu verhindern.

PS: Wer eine wirklich geniale Art sucht, um Habtm Daten zu speichern, sollte sich einmal diesen Artikel ansehen:
http://bakery.cakephp.org/articles/view/add-delete-habtm-behavior

Kategorie: CakePHP, Tipps | 3 Kommentare »


Veröffentlicht am Dienstag, den 22. Januar 2008 um 17:33 Uhr veröffentlicht

Du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.

3 Reaktionen zu “Habtm Speichern – Minihilfe”

 

  1. Chris Am 22. Januar 2008 um 22:20 Uhr

    Hi Thomas,
    wiedermal ein nützlicher Artikel, gerade die HABTM-Verbindungen sind erstmal ein Genick Brecher bei CakePHP. Enorm sinnvoll, der Link am Ende. Hatte nämlich in meiner aktuellen Anwendungen User, die sich zu Tags assoziieren konnten. Beim editieren der Tags, wurden aber alle bestehenden Tag-Verbindungen erstmal wieder gelöscht *WTF*?? Mit diesem Zusatz kann ich die Tagverbindungen nun speichern, ohne das Cake mir diese zuerst wieder raushaut :)

  2. catbyte Am 10. März 2008 um 12:49 Uhr

    Ich arbeite mich gerade in die Version 1.2 (beta) ein und habe den Vormittag damit verbracht meinen Fehler (duplicate entry) in der HABTM Funktion zu finden (CakePHP Anfänger).

    Nach ca. 2,5 Stunden musste ich herausfinden, dass es ein CakePHP Fehler ist.

    Die Lösung für alle: https://trac.cakephp.org/ticket/3814

    Viel Spaß beim backen!

  3. virtualkai.de » Blog Archive Am 5. März 2009 um 15:35 Uhr

    [...] diesem Problem zu kämpfen hat. Den Einstieg fand ich wie so oft im DIEVOLUTION-Blog mit einer Anleitung zum Speichern von HABTM-Relationen. Allerdings war das nicht das Kernproblem, da ich diese Vorgehensweise bereits praktizierte. [...]

Einen Kommentar schreiben

Du mußt angemeldet sein, um kommentieren zu können.