2012-05-14 11 views
5

Sto provando a capirci qualcosa di autoreferenziale bidirezionale in molte relazioni in CakePHP (che boccone!).CakePHP: autoreferenziale bidirezionale hasMany Attraverso le associazioni

Sto lavorando a un sito Web di corrispondenza delle immagini.

  • Le immagini sono associate ad altre immagini tramite una "corrispondenza" (il modello di join).
  • Ogni partita ha due immagini e memorizza la valutazione corrente e il numero totale di voti.
  • Durante la visualizzazione di un'immagine, tutte le immagini correlate da entrambe le direzioni dovrebbero essere disponibili (tramite le corrispondenze).

Ho iniziato definendo un hasMany attraverso la relazione con un modello di join.

I pictures_matches unirsi a tavola ha questa struttura:

id | picture_id | partner_id | rating | total_votes 

Mia match aderire all'associazione modello si presenta così:

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' => '' 
     ) 
    ); 
} 

Ogni immagine deve essere in grado di accedere alle immagini collegate da entrambe le direzioni, ma è qui che la mia presa sta scivolando. Sembra che abbia bisogno di salvare entrambi i lati della relazione, ma questo distrugge i dati extra memorizzati nel modello di join - con due voci db, il voto può variare a seconda della direzione.

Qualcuno può fare luce sul modo migliore per farlo in CakePHP? Sono piuttosto confuso.
È possibile creare le relazioni inverse al volo?

+3

Hai mai capito questo? –

+0

Se className nella sezione Partner è "Partner"? – khany

risposta

0

Puoi creare realtions al volo con il modello Model :: bindModel(), roba molto utile che ti permetterebbe di legare relazioni inverse o meglio qualsiasi direzione desideri al volo.

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

anche usando comportamento contenibile è possibile creare catena infinita di retriving vostra data di stacco associata.

contengono ('Picture.PictureMatch.Partner.PictureMatch.Picture .....')

Fondamentalmente è possibile scorrere tutti i tuoi modelli purché ogni catena è in qualche modo legata a quella successiva per spiegare meglio semplice esempio (si prega di ignorare la logica in esso)

Cerchio Quadrato belongsTo Piazza belongsTo Triangolo

Quindi triangolo non è correlato a Circle (direttamente), ma Square è kinda tra

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

o per avere più divertimento consente di ottenere cerchio cerchio con anello intorno

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

e così via, naturalmente quelli esempio sono inutili e senza alcuna logica di programmazione, ma spero che capire il punto che si può loop attraverso il numero infinito di relazioni che vanno avanti e indietro.

0

Non sono sicuro se questa è la soluzione migliore, ma se avete fatto queste cose:

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

poi, quando si esegue una ricerca basta cercare ($this->data['Picture1'] == $var || $this->data['Picture2'] == $var) e così finché si dispone di recursive impostato su 1 o 2 dovresti recuperare tutti i dati relativi a quello Picture.

0

Presumo che ciò è abbandonato, ma è facilmente risolvibile - ha a che fare con la fase

distrugge i dati aggiuntivi memorizzati nel modello unirsi

Ciò significa che il salva sono in esecuzione a deleteAll e inserendo il record sulla corrispondenza ... invece è necessario trovare e aggiornare quel record ...

Questo può essere fatto in alcuni modi, ma il più semplice è prima della chiamata di salvataggio, cercare, e includere il pri mary chiave nei dati del record della partita. Fondamentalmente non salvarlo come HABTM e salvalo come hasMany se hai già provato a trovare una chiave primaria del record di corrispondenza esistente (id) e hai aggiornato i dati da salvare con esso.

Problemi correlati