2015-06-19 11 views
6

Ich verwende CakePHP Version 3.x.Mehrere Zuordnungen zum gleichen Modell in CakePHP 3

Wenn ich die NachrichtenTabelle abfrage, möchte ich die Benutzerdaten für den Absender und den Empfänger der Nachricht erhalten. Ich habe dies viele Male in CakePHP 2 getan, aber ich kann nicht herausfinden, warum es in Version 3.x nicht funktioniert.

Ich habe eine UsersTable und eine MessageSable.

UsersTable

$this->hasMany('Messages'); 

MessagesTable

$this->belongsTo('Users', [ 
    'foreignKey' => 'sender_id', 
    'propertyName' => 'Sender', 
]); 
$this->belongsTo('Users', [ 
    'foreignKey' => 'user_id', 
    'propertyName' => 'Receiver' 
]); 

Dies ist die Abfrage ich verwende

$messages = $this->Messages->find() 
     ->where(['Messages.user_id' => $this->Auth->user('id')]) 
     ->orwhere(['Messages.sender_id' => $this->Auth->user('id')]) 
     ->order(['Messages.created' => 'DESC']) 
     ->contain([ 
      'Users.Pictures', 
     ]); 

Ich bin der Empfänger Daten zurück bekommen, aber nicht die Sender als auch Daten. Jede Hilfe würde wirklich geschätzt werden

Antwort

8

Ihre Verbände sind falsch. das gleiche Modell für mehrere Zuordnungen Wenn verwenden Sie verschiedene Alias-Namen und die className Eigenschaft (wie in CakePHP 2) verwenden müssen: -

$this->belongsTo('Sender', [ 
    'className' => 'Users', 
    'foreignKey' => 'sender_id', 
    'propertyName' => 'sender', 
]); 
$this->belongsTo('Receiver', [ 
    'className' => 'Users', 
    'foreignKey' => 'user_id', 
    'propertyName' => 'receiver' 
]); 

Dies ist described in the docs.

In Ihrem Beispiel überschreibt Code Receiver die Zuordnung für User, so dass Sie nur das Modell Receiver in den Ergebnissen sehen.

Ihre Anfrage muss dann wie etwas sein: -

$messages = $this->Messages->find() 
    ->where(['Messages.user_id' => $this->Auth->user('id')]) 
    ->orwhere(['Messages.sender_id' => $this->Auth->user('id')]) 
    ->order(['Messages.created' => 'DESC']) 
    ->contain([ 
     'Receivers' => ['Pictures'], 
     'Senders' => ['Pictures'] 
    ]); 
+0

Sie für die Antwort @drmonkeyninja danken. Ihr Vorschlag war das erste, was ich ausprobiert habe, aber das gab mir eine Fehlermeldung, dass Nachrichten nicht mit Benutzern verknüpft sind, obwohl sie mir zugeordnet sind, was mich zu der Annahme verleitete, dass ich es in CakePHP 3 falsch gemacht habe. Irgendwelche Ideen, warum es diesen Fehler gibt? – Wisd0m

+0

@ Wisd0m ist Ihr Benutzermodell in einem Plugin? – drmonkeyninja

+0

Nein mein Benutzermodell ist nicht in einem Plugin. Es ist wirklich seltsam, dass es mir diesen Fehler gibt, könnte es etwas mit der Beziehung "Benutzer hat viele (Nachrichten)" zu tun haben? – Wisd0m

2

Vielen Dank für Ihre Hilfe @drmonkeyninja. Ich habe festgestellt, was falsch war, alles, was ich tun musste, war, die Benutzervereinigungen aufzurufen, die ich in der Nachrichtenliste definiert habe, ich fühle mich jetzt so dumm.

MessagesTable

$this->belongsTo('Sender', [ 
    'className' => 'Users', 
    'foreignKey' => 'sender_id', 
    'propertyName' => 'Sender', 
]); 
$this->belongsTo('Receiver', [ 
    'className' => 'Users', 
    'foreignKey' => 'user_id', 
    'propertyName' => 'Receiver' 
]); 

Die Abfrage, die funktioniert:

$messages = $this->Messages->find() 
     ->where(['Messages.user_id' => $this->Auth->user('id')]) 
     ->orwhere(['Messages.sender_id' => $this->Auth->user('id')]) 
     ->order(['Messages.created' => 'DESC']) 
     ->contain([ 
      'Sender', 
      'Receiver' 
     ]) 
    ;