テーブルを結合して、レコードを検索。ページネーションで表示する。
備忘録。
基本は以下を見る。
やりたいこと
投稿記事一覧に、記事を投稿した人の名前を表示させる。
投稿した人 = Usersテーブルのusernameカラム
usersテーブル
postsテーブル
手順
まず、PostsTableのinitializeメソッドに以下を追加。
PostsTable.php
class PostsTable extends AppTable
{
public function initialize(array $config)
{
parent::initialize($config);
$this->belongsTo('Users'); ←これを追加する。
}
PostsControllerに、'contain' => ['Users']を追加。
PostsController.ctp
class PostsController extends AppController
{
public $paginate = [
'limit' => 6,
'order' => ['created' => 'desc'],
'contain' => ['Users'] // ←これを追加。
];
index.ctp
問題なければ、PostsテーブルにUsersテーブルがjoinされているはずなので、以下のコードでusernameが表示される。
<?php foreach ($posts as $post): ?>
<tr>
<td><?= $this->Number->format(h($post->id)) ?></td>
<td><?= h($post->body) ?></td>
<td><?= h($post->user_id) ?></td>
<!-- postテーブルにusersテーブルをbelongして結合している。 -->
<td><?= h($post->user->username) ?></td> ←これを追加。
<td><?= h($post->created) ?></td>
<td><?= h($post->modified) ?></td>
以上でindexに記事を投稿した人の名前が表示されるようになる。