2012-05-14 13 views
5

Ich versuche, meinen Kopf bidirektionale selbstreferenzielle hasMany durch Beziehungen in CakePHP (was für ein Bissen!).CakePHP: bidirektionale selbstreferentielle hasMany Durch Assoziationen

Ich arbeite an einer Bild passenden Website.

  • Bilder werden mit anderen Bildern über eine "Übereinstimmung" (das Join-Modell) verknüpft.
  • Jedes Spiel hat zwei Bilder und speichert die aktuelle Bewertung und die Gesamtzahl der Stimmen.
  • Wenn ein Bild angezeigt wird, sollten alle zugehörigen Bilder aus jeder Richtung verfügbar sein (über seine Übereinstimmungen).

Ich habe damit begonnen, eine hasMany-Beziehung mit einem Join-Modell zu definieren.

Die pictures_matches Join-Tabelle mit dieser Struktur hat:

id | picture_id | partner_id | rating | total_votes 

Mein Spiel beitreten Modell Verband wie folgt aussieht:

class PictureMatch extends AppModel { 

... 

    public $belongsTo = array(
     'Picture' => array(
      'className' => 'Picture', 
      'foreignKey' => 'picture_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
     'Partner' => array(
      'className' => 'Picture', 
      'foreignKey' => 'partner_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ) 
    ); 
} 

Jedes Bild seine verwandten Bilder in der Lage sein muss, aus beiden Richtungen zugreifen zu können, Aber hier rutscht mein Griff. Es sieht so aus, als ob ich beide Seiten der Beziehung speichern muss, aber das zerstört die zusätzlichen Daten, die im Join-Modell gespeichert sind - mit zwei db-Einträgen kann die Abstimmung je nach Richtung variieren.

Kann jemand etwas Licht auf den besten Weg, dies in CakePHP zu tun? Ich bin ziemlich verwirrt.
Ist es möglich, die umgekehrten Beziehungen im laufenden Betrieb zu erstellen?

+3

Haben Sie das jemals herausgefunden? –

+0

Sollte className im Partner-Bereich "Partner" sein? – khany

Antwort

0

Sie können realtions on the fly vie Model :: bindModel() erstellen, sehr nützliche Dinge, die Ihnen erlauben würden, umgekehrte Beziehungen oder eher jede Richtung, die Sie im laufenden Betrieb möchten, zu binden.

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

Auch Contain Verhalten mit Ihnen unendliche Kette von retriving Ihre zugehörigen Datum ex erstellen können.

enthalten (‚Picture.PictureMatch.Partner.PictureMatch.Picture .....‘)

Grundsätzlich können Sie eine Schleife durch alle Ihre Modelle, solange jede Kette irgendwie zum nächsten verwandt ist zu erklären, es besser einfaches Beispiel (bitte darin außer Acht lassen Logik)

Kreis belongsTo Platz Platz belongsTo Dreieck

So Dreieck ist nicht auf Kreis (direkt) verwandt, aber Platz ist irgendwie zwischen

Circle->find('all', array('...', contain => array('Square.Triangle')); 

oder mehr Spaß haben können Kreis durch den Kreis mit Schleife umgehen

Circle->find('all', array('...', contain => array('Square.Trinagle.Square.Circle')); 

und so weiter, natürlich diejenigen Beispiel sind nutzlos und ohne Programmierlogik, aber ich hoffe, dass Sie den Punkt verstehen, dass Sie kann Loop Trog unendliche Anzahl von Beziehungen hin und her.

0

Ich bin nicht sicher, ob dies die beste Lösung ist, aber wenn Sie das tun:

public $belongsTo = array(
    'Picture1' => array(
     'className' => 'Picture', 
     'foreignKey' => 'picture_id', 
    ), 
    'Picture2' => array(
     'className' => 'Picture', 
     'foreignKey' => 'picture_id', 
    ), 
    'Partner' => array(
     'className' => 'Partner', 
     'foreignKey' => 'partner_id', 
    ), 
); 

dann, wenn Sie eine Suche suchen Sie nur für ($this->data['Picture1'] == $var || $this->data['Picture2'] == $var) und so lange, wie Sie recursive Satz 1 oder 2 haben Sie sollten alle zugehörigen Daten für diese Picture zurück erhalten.

0

Ich nehme an, das aufgegeben wird, aber es ist leicht auflösbar - es mit der Phase zu tun hat

die zusätzlichen Daten im Modell anschließen

speicherbaren zerstört bedeutet, dass Ihr spart laufen a deleteAll und den Datensatz auf passende einfügen ... stattdessen müssen Sie suchen und aktualisieren Sie diesen Datensatz ...

Dies kann auf verschiedene Arten erfolgen, aber die einfachste ist vor dem Speichern, suchen Sie es nach, und schließe das pri ein Mary Schlüssel in den Match Record Daten. Speichern Sie es grundsätzlich nicht als HABTM und speichern Sie es nur als hasMany, wenn Sie bereits versucht haben, einen vorhandenen Match-Record-Primärschlüssel (id) zu finden und die Daten zu aktualisieren, um damit zu speichern.

Verwandte Themen