2015-06-19 16 views
6

Sto usando cakePHP versione 3.x.Associazioni multiple allo stesso modello in CakePHP 3

Quando interrogo il MessageTable, desidero ottenere i dati degli utenti per il mittente e il destinatario del messaggio. L'ho fatto molte volte in cakePHP 2 ma non riesco a capire perché non funziona nella versione 3.x.

Ho un UserTable e un MessagesTable.

UsersTable

$this->hasMany('Messages'); 

MessagesTable

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

Questa è la query che sto usando

$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', 
     ]); 

sto ottenendo i dati del ricevitore di nuovo, ma non i dati del mittente pure. Qualsiasi aiuto sarebbe molto apprezzato

risposta

8

Le tue associazioni hanno torto. Se si utilizza lo stesso modello per più associazioni è necessario utilizzare diversi alias e la className proprietà (proprio come in CakePHP 2): -

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

Questo è described in the docs.

Nel codice di esempio Receiver sovrascrive l'associazione per User in modo che nei risultati venga visualizzato solo il modello Receiver.

Vostri criteri di allora deve essere qualcosa di simile: -

$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

Grazie per la risposta @drmonkeyninja. Il tuo suggerimento è stata la prima cosa che ho provato ma mi ha dato un errore dicendo che Messaggi non è associato agli utenti anche se sono associati, il che mi fa pensare che stavo sbagliando in CakePHP 3, ecco perché l'ho cambiato. Qualche idea sul perché dà quell'errore? – Wisd0m

+0

@ Wisd0m è il modello degli utenti in un plug-in? – drmonkeyninja

+0

nessun modello degli utenti non è in un plug-in. E 'davvero strano che mi dia questo errore, potrebbe avere qualcosa a che fare con la relazione Users hasMany (' Messages ')? – Wisd0m

2

Grazie per il vostro aiuto @drmonkeyninja. Ho trovato che cosa c'era di sbagliato, tutto quello che dovevo fare era chiamare le associazioni di utenti che ho definito in MessagesTable, mi sento così stupido ora.

MessagesTable

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

La query che funziona:

$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' 
     ]) 
    ; 
Problemi correlati