2015-06-19 3 views
6

Я использую cakePHP версии 3.x.Несколько ассоциаций к одной и той же модели в CakePHP 3

Когда я запрашиваю MessageTable, я хочу получить данные Пользователя для отправителя и получателя сообщения. Я делал это много раз в cakePHP 2, но я не могу понять, почему он не работает в версии 3.x.

У меня есть UserTable и MessageTable.

UsersTable

$this->hasMany('Messages'); 

MessagesTable

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

Это запрос, я использую

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

Я получаю данные приемника обратно, но не данные отправителя, а также. Любая помощь была бы действительно оценена

ответ

8

Ваши ассоциации ошибочны. При использовании той же модели для нескольких ассоциаций, которые необходимо использовать различные псевдонимы и свойство className (точно так же, как в CakePHP 2): -

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

Это described in the docs.

В вашем примере код Receiver перезаписывает ассоциацию для User, поэтому вы видите только модель Receiver в результатах.

Ваш запрос, то должно быть что-то вроде: -

$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

Спасибо за @drmonkeyninja ответ. Ваше предложение было первым, что я пробовал, но это дало мне сообщение о том, что сообщения не связаны с пользователями, хотя они связаны, что заставило меня поверить, что я делал это неправильно в cakePHP 3, поэтому я изменил его. Любые идеи относительно того, почему он дает эту ошибку? – Wisd0m

+0

@ Wisd0m - ваша модель пользователей в плагине? – drmonkeyninja

+0

Модель моих пользователей не находится в плагине. Действительно ли это странно, что он дал мне эту ошибку, может ли это иметь какое-то отношение к отношениям пользователей hasMany ('Messages')? – Wisd0m

2

Спасибо за вашу помощь @drmonkeyninja. Я нашел то, что было не так, все, что мне нужно было сделать, это вызвать ассоциации пользователей, которые я определил в MessageTable, теперь я так глуп.

MessagesTable

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

Запрос, который работает:

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