アソシエーション利用のデータアクセス (2) (1/5)
作成:2015-11-14 07:59
更新:2015-11-14 07:59
更新:2015-11-14 07:59
■Messagesのデータ取得処理
前回に引き続き、アソシエーションによるモデルのCRUDについて考えていきましょう。今回は、Messages側の処理についてです。
まずは、データの一覧表示からです。これは、indexアクションとして作成することになるでしょう。
MembersとMessagesでは、Messages側に、関連するMembersのデータのID番号を記録する「外部キー」が用意されていました。データを検索する際には、Messagesだけでなく、この外部キーに設定されているIDのMembersデータも合わせて取り出したいですね。
下のリスト欄に、簡単なサンプルを掲載しておきます。ここでは、まずページネーション時に必要となるcontainオプションを設定しておきます。
containというのは、前回、getでデータを取得する際、引数として用意したのと同じ値ですね。これを連想配列として用意しておきます。containには、'Members'を指定して、このMessagesがMembersと関連付けられていることを示しておきます。
paginateには、ページネーションの設定などが保管されています。これに、用意した連想配列の値を設定します。後は、paginateメソッドを使い、Messagesのデータを取得し、messagesに設定します。
$this->Messagesを引数に指定してpaginateを呼び出しています。そして、'_serialize'には、messagesを指定しておきます。この部分は、Memberの処理とまったく同じですね。違いは、事前にcontainを設定しておく、というだけです。これをあらかじめ指定しておくことで、アソシエーションを設定した状態でページネーションを行うようになるのですね。
Messagesに関連するMembersを検索するような処理はまったくありません。そうした処理は、必要ないのです。ただcontainを指定してMessagesを検索すれば、それぞれのMessagesデータに関連するMembersデータも一緒に抜き出されます。
後はテンプレート側で、受け取ったMessagesの値を出力していくだけですね。これは<table>タグ内で繰り返しを使い、$messagesから順に値を取り出し出力していけばいいでしょう。ざっとこんな感じですね。
ここではMessagesのタイトル(title)と、そのMessagesを投稿した利用者のMembersデータの名前(name)を出力しています。Messagesのtitleは、とても簡単です。
今回も、Messageのtitleを表示する他に、「View」「Eidt」「Delete」といったアクションのリンクを出力させてあります。以後、これらのリンク先のアクションを実装していくことにしましょう。
まずは、データの一覧表示からです。これは、indexアクションとして作成することになるでしょう。
MembersとMessagesでは、Messages側に、関連するMembersのデータのID番号を記録する「外部キー」が用意されていました。データを検索する際には、Messagesだけでなく、この外部キーに設定されているIDのMembersデータも合わせて取り出したいですね。
下のリスト欄に、簡単なサンプルを掲載しておきます。ここでは、まずページネーション時に必要となるcontainオプションを設定しておきます。
$this->paginate = [
'contain' => ['Members']
];
containというのは、前回、getでデータを取得する際、引数として用意したのと同じ値ですね。これを連想配列として用意しておきます。containには、'Members'を指定して、このMessagesがMembersと関連付けられていることを示しておきます。
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->titleforeachで$messageにMessagesインスタンスが代入されますから、そのtitleを出力するだけですね。このMessagesに関連付けられるMembersデータのnameは、
$message->member->nameこのようになります。
今回も、Messageのtitleを表示する他に、「View」「Eidt」「Delete」といったアクションのリンクを出力させてあります。以後、これらのリンク先のアクションを実装していくことにしましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
public function index() { $this->paginate = [ 'contain' => ['Members'] ]; $this->set('messages', $this->paginate($this->Messages)); $this->set('_serialize', ['messages']); }
※関連コンテンツ
「初心者のためのCakePHP3 プログラミング入門」に戻る