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

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

作成:2015-11-14 07:59
更新:2015-11-14 07:59

■Messagesのデータ取得処理

前回に引き続き、アソシエーションによるモデルのCRUDについて考えていきましょう。今回は、Messages側の処理についてです。

まずは、データの一覧表示からです。これは、indexアクションとして作成することになるでしょう。

MembersMessagesでは、Messages側に、関連するMembersのデータのID番号を記録する「外部キー」が用意されていました。データを検索する際には、Messagesだけでなく、この外部キーに設定されているIDのMembersデータも合わせて取り出したいですね。

下のリスト欄に、簡単なサンプルを掲載しておきます。ここでは、まずページネーション時に必要となるcontainオプションを設定しておきます。
$this->paginate = [
    'contain' => ['Members']
];

containというのは、前回、getでデータを取得する際、引数として用意したのと同じ値ですね。これを連想配列として用意しておきます。containには、'Members'を指定して、このMessagesMembersと関連付けられていることを示しておきます。

paginateには、ページネーションの設定などが保管されています。これに、用意した連想配列の値を設定します。後は、paginateメソッドを使い、Messagesのデータを取得し、messagesに設定します。
$this->set('messages', $this->paginate($this->Messages));
$this->set('_serialize', ['messages']);

$this->Messagesを引数に指定してpaginateを呼び出しています。そして、'_serialize'には、messagesを指定しておきます。この部分は、Memberの処理とまったく同じですね。違いは、事前にcontainを設定しておく、というだけです。これをあらかじめ指定しておくことで、アソシエーションを設定した状態でページネーションを行うようになるのですね。

Messagesに関連するMembersを検索するような処理はまったくありません。そうした処理は、必要ないのです。ただcontainを指定してMessagesを検索すれば、それぞれのMessagesデータに関連するMembersデータも一緒に抜き出されます。

後はテンプレート側で、受け取ったMessagesの値を出力していくだけですね。これは<table>タグ内で繰り返しを使い、$messagesから順に値を取り出し出力していけばいいでしょう。ざっとこんな感じですね。
<?php foreach ($messages as $message): ?>
<tr>
    <td><?= $this->Number->format($message->id) ?></td>
    <td><?= __($message->title) ?></td>
    <td><?= $message->has('member') ?
        $this->Html->link($message->member->name,
        ['controller' => 'Members', 'action' => 'view',
        $message->member->id]) : '' ?>
</td>
    <td class="actions">
        <?= $this->Html->link(__('View'), ['action' => 'view',
            $message->id]) ?>
        <?= $this->Html->link(__('Edit'), ['action' => 'edit',
            $message->id]) ?>
        <?= $this->Form->postLink(__('Delete'),
            ['action' => 'delete', $message->id],
            ['confirm' => __('you want to delete # {0}?',
            $message->id)]) ?>

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

ここではMessagesのタイトル(title)と、そのMessagesを投稿した利用者のMembersデータの名前(name)を出力しています。Messagesのtitleは、とても簡単です。
$message->title
foreach$messageMessagesインスタンスが代入されますから、そのtitleを出力するだけですね。このMessagesに関連付けられるMembersデータのnameは、
$message->member->name
このようになります。

今回も、Messageのtitleを表示する他に、「View」「Eidt」「Delete」といったアクションのリンクを出力させてあります。以後、これらのリンク先のアクションを実装していくことにしましょう。

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

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

●プログラム・リスト●

public function index()
{
    $this->paginate = [
        'contain' => ['Members']
    ];
    $this->set('messages', $this->paginate($this->Messages));
    $this->set('_serialize', ['messages']);
}

※関連コンテンツ

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