Моя попытка применить это пример 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 без добавления таблицы соединения? У меня такое ощущение, что я не правильно использую псевдонимы, но я не могу понять, где именно.
Прежде всего, если у вас нет ничего подобного в 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».
Все работает, как предложил Даниил, но важно НЕ иметь
'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>