Несколько отношений к одной и той же модели: от CakePHP 2.x до CakePHP 3.x

Моя попытка применить это пример CakePHP3: таблицы users а также messages (id, user_id, recipient_id, body) с двумя внешними ключами id в users,

Следующие фрагменты кода в MessagesTable.php:

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

в MessagesController.php в view а также index методы:

    $message = $this->Messages->get($id, [
'contain' => ['Users'],
'contain' => ['Sender'],
'contain' => ['Recipient']
]);

в UsersTable.php:

    $this->hasMany('MessagesSent', [
'foreignKey' => 'user_id',
'className' => 'Messages',
'propertyName' => 'MessagesSent'

]);

$this->hasMany('MessagesReceived', [
'foreignKey' => 'recipient_id',
'className' => 'Messages',
'propertyName' => 'MessagesReceived'
]);

И в UsersController.php в view метод:

    $user = $this->Users->get($id, [
'contain' => ['MessagesSent'],
'contain' => ['MessagesReceived']
]);

не показывать Related Messages в этом пользователи view.ctp:

<h4><?= __('Related Messages') ?></h4>
<?php if (!empty($user->messages)): ?>
<table cellpadding="0" cellspacing="0">
<tr>
<th scope="col"><?= __('Id') ?></th>
<th scope="col"><?= __('User Id') ?></th>
<th scope="col"><?= __('Recipient Id') ?></th>
<th scope="col"><?= __('Body') ?></th>
</tr>
<?php foreach ($user->messages as $messages): ?>
<tr>
<td><?= h($messages->id) ?></td>
<td><?= h($messages->user_id) ?></td>
<td><?= h($messages->recipient_id) ?></td>
<td><?= h($messages->body) ?></td>

</tr>
<?php endforeach; ?>
</table>

Если я уйду только hasMany('Messages') в UsersTable.php а также 'contain' => ['Messages'] в UsersController.phpЯ вижу Related Messages в view выше, но, очевидно, только те, которые связаны с отправителем.

В обоих случаях add а также edit сообщения приводят к ошибке: Table "App\Model\Table\MessagesTable" is not associated with "Users",

Есть ли способ исправить это в CakePHP3.x без добавления таблицы соединения? У меня такое ощущение, что я не правильно использую псевдонимы, но я не могу понять, где именно.

1

Решение

Прежде всего, если у вас нет ничего подобного в MessagesTable.php:

$this->belongsTo('Users', []);

«Таблица» App \ Model \ Table \ MessagesTable «не связана с» Пользователи «» правильно. Поэтому в MessagesController.php вы должны содержать только получателя и отправителя:

$message = $this->Messages->get($id, [
'contain' => ['Sender', 'Recipient'],
]);

Что касается проблемы «Похожие сообщения», вы должны учитывать, что если вы содержите сообщения «MessagesSent» и «MessagesReceived», у вашей сущности будет не массив «messages», а два разных массива, которые называются «messages_received» и «messages_sent».

0

Другие решения

Все работает, как предложил Даниил, но важно НЕ иметь

'propertyName' => 'MessagesSent'

а также

'propertyName' => 'MessagesReceived'

в UsersTable.php!

view.ctp выше, например, отправленные сообщения должны выглядеть так:

<h4><?= __('Related Sent Messages') ?></h4>
<?php if (!empty($user->messages_sent)): ?>
<table cellpadding="0" cellspacing="0">
<tr>
<th scope="col"><?= __('Id') ?></th>
<th scope="col"><?= __('User Id') ?></th>
<th scope="col"><?= __('Recipient Id') ?></th>
<th scope="col"><?= __('Body') ?></th>
</tr>
<?php foreach ($user->messages_sent as $messages): ?>
<tr>
<td><?= h($messages->id) ?></td>
<td><?= h($messages->user_id) ?></td>
<td><?= h($messages->recipient_id) ?></td>
<td><?= h($messages->body) ?></td>

</tr>
<?php endforeach; ?>
</table>
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector