2017-08-19 2 views
1

Ma tentative d'appliquer cette example à CakePHP3: tables users et messages (id, user_id, recipient_id, body) avec deux clés étrangères à id dans users.Relations multiples avec le même modèle de CakePHP 2.x à 3.x CakePHP

Les morceaux de code suivant dans MessagesTable.php:

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

en MessagesController.php dans view et index méthodes:

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

dans UsersTable.php:

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

    ]); 

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

et en UsersController.php dans view méthode:

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

ne montrent pas Related Messages dans cet utilisateur 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> 

Si je laisse seulement hasMany('Messages') dans UsersTable.php et 'contain' => ['Messages'] à UsersController.php, je ne vois Related Messages dans le view ci-dessus, mais évidemment seulement ceux, liés à l'expéditeur.

Dans les deux cas add et edit messages dans Erreur: Table "App\Model\Table\MessagesTable" is not associated with "Users".

Y at-il un moyen de résoudre ce problème dans CakePHP3.x sans ajouter une table de jointure? J'ai le sentiment que je n'utilise pas correctement les alias, mais je ne peux pas savoir exactement où.

Répondre

0

Tout d'abord, sauf si vous avez quelque chose comme ça dans MessagesTable.php:

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

La "Table "App \ Modèle \ Tableau \ MessagesTable" est pas associé à "utilisateurs"" est correct. Donc, en MessagesController.php vous ne devez contenir destinataire et l'expéditeur:

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

A propos de la question « Messages connexes », vous devriez considérer que si vous contiens « MessagesSent » et « MessagesReceived », votre entité ne sera pas un " tableau de messages, mais deux tableaux différents appelés 'messages_received' et 'messages_sent'.

+0

Merci!L'erreur est partie et je peux ajouter et éditer des messages, c'est génial. J'ai changé partout dans le view.ctp ci-dessus 'messages' à 'messages_sent', mais toujours rien n'apparaît dans "Related Messages". Dois-je également changer quelque chose dans l'entité du message elle-même et/ou les contrôleurs? –

+0

Salut Vincent, je ne sais pas si je comprends bien la question que vous posez. Pour autant que je puisse voir, il n'y a rien d'autre à changer. –

0

Tout fonctionne comme Daniel a suggéré, mais il est important de ne pas avoir

'propertyName' => 'MessagesSent'

et

'propertyName' => 'MessagesReceived'

à UsersTable.php!

Le view.ctp ci-dessus par exemple. les messages envoyés devraient ressembler à ceci:

<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>