libro
www.tuyano.com
初心者のためのCakePHP3 プログラミング入門

アソシエーション利用のデータアクセス (1) (3/6)

作成:2015-11-07 10:52
更新:2015-11-07 10:52

■Memberと関連するMessagesの内容を表示する

続いて、Membersのindexに作成された「View」リンクで表示されるページについてです。先ほどのindexでは、Viewリンクをクリックすると、
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を処理できる、というわけです。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

public function view($id = null)
{
    $member = $this->Members->get($id, [
        'contain' => ['Messages']
    ]);
    $this->set('member', $member);
    $this->set('_serialize', ['member']);
}

※関連コンテンツ

「初心者のためのCakePHP3 プログラミング入門」に戻る