Я использую 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. Любая помощь могла бы быть полезна
Ваши ассоциации ошибочны. Если вы используете одну и ту же модель для нескольких ассоциаций, вам нужно использовать разные псевдонимы и свойство 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' ]) ;