アソシエーション利用のデータアクセス (1) (3/6)
作成:2015-11-07 10:52
更新:2015-11-07 10:52
更新:2015-11-07 10:52
■Memberと関連するMessagesの内容を表示する
続いて、Membersのindexに作成された「View」リンクで表示されるページについてです。先ほどのindexでは、Viewリンクをクリックすると、
といったアドレスになります。viewアクションでは、あわせて送られたID番号を元にMembersのデータを取得し、そのデータに関連付けられたMessagesのリストも取得して表示しよう、というわけです。では、アクションメソッドはどのようになるのでしょうか。下のリスト欄に掲載しておきましょう。
これを見ればわかるように、実はデータベースからデータを取得しているのは、わずか1文だけです。これは整理すると以下のようになります。
getは、引数に指定したIDのデータを取得するメソッドです。が、アソシエーションを利用する場合、第2引数に「contain」というキーを用意し、それに関連するモデル名を指定することで、getしたデータに関連付けられている別のモデルのデータをもまとめて取り出すことができます。
では、こうして取り出したデータをどのように出力するのか見てみましょう。まずは、Membersのデータです。これは簡単ですね。
たとえば、こんな感じです。$memberの値を取り出し出力するだけです。問題は、関連するMessagesデータです。
アソシエーションを設定している場合、関連するMessagesのデータは、「$member->messages」という形でまとめられています。ここからデータを順に変数に取り出し、繰り返し処理していけば、関連するすべてのMessagesを処理できる、というわけです。
http://localhost:8765/members/view/1
といったアドレスになります。viewアクションでは、あわせて送られたID番号を元にMembersのデータを取得し、そのデータに関連付けられたMessagesのリストも取得して表示しよう、というわけです。では、アクションメソッドはどのようになるのでしょうか。下のリスト欄に掲載しておきましょう。
これを見ればわかるように、実はデータベースからデータを取得しているのは、わずか1文だけです。これは整理すると以下のようになります。
$this->Members->get($id, ['contain' => ['Messages']]);
getは、引数に指定したIDのデータを取得するメソッドです。が、アソシエーションを利用する場合、第2引数に「contain」というキーを用意し、それに関連するモデル名を指定することで、getしたデータに関連付けられている別のモデルのデータをもまとめて取り出すことができます。
では、こうして取り出したデータをどのように出力するのか見てみましょう。まずは、Membersのデータです。これは簡単ですね。
<div class="row">
<h4><?= __('Name') ?></h4>
<?= $this->Text->autoParagraph(h($member->name)); ?>
</div>
<div class="row">
<h4><?= __('Mail') ?></h4>
<?= $this->Text->autoParagraph(h($member->mail)); ?>
</div>
たとえば、こんな感じです。$memberの値を取り出し出力するだけです。問題は、関連するMessagesデータです。
<table cellpadding="0" cellspacing="0">
<tr>
<th><?= __('Id') ?></th>
<th><?= __('Members Id') ?></th>
<th><?= __('Title') ?></th>
<th><?= __('Comment') ?></th>
<th class="actions"><?= __('Actions') ?></th>
</tr>
<?php foreach ($member->messages as $messages): ?>
<tr>
<td><?= h($messages->id) ?></td>
<td><?= h($messages->members_id) ?></td>
<td><?= h($messages->title) ?></td>
<td><?= h($messages->comment) ?></td>
<td class="actions">
<?= $this->Html->link(__('View'), ['controller' => 'Messages',
'action' => 'view', $messages->id]) ?>
<?= $this->Html->link(__('Edit'), ['controller' => 'Messages',
'action' => 'edit', $messages->id]) ?>
<?= $this->Form->postLink(__('Delete'), ['controller' => 'Messages',
'action' => 'delete', $messages->id],
['confirm' => __('Are you sure you want to delete # {0}?',
$messages->id)]) ?>
</td>
</tr>
<?php endforeach; ?>
</table>
アソシエーションを設定している場合、関連するMessagesのデータは、「$member->messages」という形でまとめられています。ここからデータを順に変数に取り出し、繰り返し処理していけば、関連するすべてのMessagesを処理できる、というわけです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
public function view($id = null) { $member = $this->Members->get($id, [ 'contain' => ['Messages'] ]); $this->set('member', $member); $this->set('_serialize', ['member']); }
※関連コンテンツ
「初心者のためのCakePHP3 プログラミング入門」に戻る