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

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

作成:2015-11-14 08:02
更新:2015-11-14 08:02

■Messagesのデータ取得

では、「View」リンクの処理からです。

これは、viewアクションとして用意されます。/view/1というように、表示するデータのID番号を指定してアクセスすることで、そのデータの詳細が表示されるようにする、というわけですね。Membersにあったものとだいたい同じです。

下にviewアクションのサンプルを掲載しておきます。これも、Membersのviewアクションと基本的にはかわらないことがわかるでしょう。
$message = $this->Messages->get($id, [
    'contain' => ['Members']
]);

まず、getでID番号を指定してMessagesデータを検索します。このとき、第2引数にオプションとしてcontainを用意しておきます。これでインスタンスが得られるので、後はそれをmessageに代入し、_serializeの設定を行うだけです。
$this->set('message', $message);
$this->set('_serialize', ['message']);

こうしてデータが得られたら、後はテンプレートの出番ですね。これは、ざっと以下のような形で出力すればよいでしょう。
<table class="vertical-table">
    <tr>
        <th><?= __('Member') ?></th>
        <td><?= $message->has('member') ?
            $this->Html->link($message->member->name,
            ['controller' => 'Members',
            'action' => 'view', $message->member->id]) : '' ?>
</td>
    </tr>
    <tr>
        <th><?= __('Id') ?></th>
        <td><?= $this->Number->format($message->id) ?></td>
    </tr>
</table>
<div class="row">
    <h4><?= __('Title') ?></h4>
    <?= $this->Text->autoParagraph(h($message->title)); ?>
</div>
<div class="row">
    <h4><?= __('Comment') ?></h4>
    <?= $this->Text->autoParagraph(h($message->comment)); ?>
</div>

ここでは、コントローラーから渡された$messagesの中から必要な値を出力しています。Messagesの内容は、こんな具合に指定すれば得られますね。
$message->title
$message->comment
このMessagesデータに関連付けられているMembersデータは、$message->memberという値に保管されています。例えば、投稿した人の名前を出力するならば、
$message->member->name
こんな具合に指定すれば名前を得ることができます。アソシエーションの方式は、MembersMessagesで違います(Membersから見ればMessagesはhas many、Messagesから見ればMembersはbelongs to)が、関連するデータの扱い方はまったく同じです。インスタンスの中に、関連するモデル名のプロパティがあり、そこにその関連モデルのインスタンスが代入されているのです。

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

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

●プログラム・リスト●

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

※関連コンテンツ

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