Несколько ассоциаций к одной и той же модели в CakePHP 3

Я использую cakePHP версии 3.x.

Когда я запрашиваю 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', ]); 

Я получаю данные Receiver, но не данные Sender. Любая помощь могла бы быть полезна

Solutions Collecting From Web of "Несколько ассоциаций к одной и той же модели в CakePHP 3"

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

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

Это описано в документах .

В вашем примере код 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'] ]); 

Благодарим вас за помощь @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' ]) ;