2012-04-11 12 views
1

In meiner App kann ein Benutzer mit einem anderen Benutzer befreundet sein. Sie haben also eine viel zu viele Beziehung zwischen zwei Tabellen. Auf diese Art und Weise: Users > Friends < UsersMehrere Beziehungen zu einer Tabelle in CakePHP

Die Tabellen wie folgt aussehen:

Users: 
id 
username 
password 

Friends: 
id 
user_id_from 
user_id_to 

und ich habe die Modelle auf wie so gesetzt:

class User extends AppModel 
{ 
    public $name = 'User'; 

    public $hasOne = 'Profile'; 

    public $hasMany = array(
     'Post', 
     'Answer', 
    'Friend' 
    ); 

    public $actsAs = array('Containable'); 
} 

class Friend extends AppModel 
{ 
    var $name = 'Friend'; 

    var $belongsTo = array(
     'Sender' => array(
      'className' => 'User', 
      'foreignKey' => 'user_id_from' 
     ), 
     'Recipient' => array(
      'className' => 'User', 
      'foreignKey' => 'user_id_to' 
     ) 
    ); 

    public $actsAs = array('Containable'); 
} 

aber es scheint nicht, um sie richtig zu verknüpfen?

Ich benutze diesen Code innerhalb des User-Modell:

public function getFriends($username) 
    { 
     return $this->find('all', array('conditions' => array('User.username' => $username, 'Friend.status'=>1) 

     )); 
    } 

und dann, wenn eine URL wie /users/USERNAME/friends besuchen sie die Freunde für diese Person Liste sollte. Die Methode, die es aufruft ist:

public function index($username) 
{ 
    $friends = $this->User->getFriends($username); 

    $this->set('friends', $this->paginate()); 
} 

Was ist das Problem?

+0

keine Updates bitte. Da bin ich wirklich verwirrt und möchte das behoben haben. – Cameron

Antwort

2

Für eine Freundschaftsbeziehung sollten Sie HABTM anstelle von hasMany verwenden.

class User extends AppModel 
{ 
    public $name = 'User'; 

    public $hasOne = 'Profile'; 

    public $hasMany = array(
     'Post', 
     'Answer', 
    ); 

    public $hasAndBelongsToMany = array(
     'Friend' => array(
     'className' => 'User', 
     'joinTable' => 'friends', 
     'foreignKey' => 'user_id_to', 
     'associationForeignKey' => 'user_id_from', 
    ) 
    ); 

    public $actsAs = array('Containable'); 
} 

Ihr aktuellen Freund Modell entfernen, da es nicht erforderlich ist, und wird möglicherweise Kuchen verwirren.

Ihre getFriends() Methode wird wie folgt aussehen:

public function getFriends($username) { 
    return $this->find('all', array(
    'conditions' => array(
     'User.username' => $username, 
     'User.status'=>1 
    ), 
     'contain' => array(
     'Friend' 
    ) 
    )); 
} 

Hier suchen wir nach dem Vorbild User und umfassen alle diesen Freund Aufzeichnungen des Benutzers. Cake ruft automatisch die Join-Tabellendaten ab und fügt die Benutzerdaten hinzu. $this->User->getFriends('Jeremy'); werden die Daten zurück, die wie folgt aussieht:

Array 
(
    [User] => Array 
     (
      [id] => 1 
      [username] => Jeremy 
     ) 
    [Friend] => Array 
     (
      [0] => Array 
       (
        [id] => 2 
        [username] => Cameron 
       ) 
      [1] => Array 
       (
        [id] => 3 
        [name] => Mark 
       ) 
      [2] => Array 
       (
        [id] => 4 
        [name] => Bob 
       ) 
     ) 
) 

Jeder Freund Schlüssel hier ist eigentlich ein User-Modell Ergebnis.

Sie können mehr über HABTM hier lesen: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm

+0

Gibt mir diesen Fehler: Modell "Friend" ist nicht mit Modell "Sender" verbunden Fehler: SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte 'Sender.username' in 'WHERE-Klausel' SQL-Abfrage: SELECT 'Friend '.'id',' Friend'.username', 'Friend'.Passwort',' Friend''Email', 'Friend'.Status',' Friend''Code', 'Friend'. 'lastlogin' VON' db52704_favorr''users' AS 'Freund' WO' Sender'.username' = 'cameron' UND 'Friend'.status' = 1' – Cameron

+0

Ich habe in meinem Friend-Modell nichts geändert (es ist immer noch so wie in meinem OP), also muss ich dort auch etwas machen, dass du nicht gepostet hast? Danke – Cameron

+0

Es tritt nicht dem Sender-Modell bei. Haben Sie sichergestellt, dass "Containable" an das Friend-Modell angehängt ist? Oder Sie können "rekursiv" versuchen, nur um es zu überprüfen. – jeremyharris

Verwandte Themen