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

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

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

■Messagesのデータ更新

続いて、データの更新です。

これは、editアクションとして用意しておきます。あらかじめフォームを表示したテンプレートを用意しておき、アクセス時にそのフォームに編集するデータの内容を設定しておく。そして送信したら、送られたデータを元にデータを更新する、という流れになります。このあたりは、Membersの更新処理と同じですね。

では、アクションを挙げておきましょう。下のリスト欄に簡単なサンプルコードを用意しておきました。ここでは、まずIDを指定してMessagesデータを取り出しておきます。
$message = $this->Messages->get($id, [
    'contain' => []
]);

例によって、第2引数にはcontainを用意しておきます。が、値は空のままですね。Messagesは、belongs toで関連付けられている(外部キーで、関連するMembersがしっかりと指定されている)ので、containによるMembersの指定は行いません。Membersには外部キーなどの関連するモデルの情報はありませんので、containで「取り出すときは関連するMessagesを含むんだよ」と指定してやったのですね。

後は、送信されたフォームのデータをpatchEntity$messageにマージし、saveで保存するだけです。
$message = $this->Messages->patchEntity($message, $this->request->data);
if ($this->Messages->save($message)) ……
このあたりは、既に何度も登場した処理ですからわかりますね。では、テンプレートのフォームがどうなるか掲載しておきましょう。
<?= $this->Form->create($message) ?>
<fieldset>
    <legend><?= __('Edit Message') ?></legend>
    <?php
        echo $this->Form->input('members_id', ['options' => $members]);
        echo $this->Form->input('title');
        echo $this->Form->input('comment');
    ?>

</fieldset>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>

基本的には、新規作成のadd用フォームと同じですね。$this->Form->create($message)というよに、フォーム作成時に$messagesを指定しておけば、その値を使ってフォームが生成されます。

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

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

●プログラム・リスト●

public function edit($id = null)
{
    $message = $this->Messages->get($id, [
        'contain' => []
    ]);
    if ($this->request->is(['patch', 'post', 'put'])) {
        $message = $this->Messages->patchEntity($message, $this->request->data);
        if ($this->Messages->save($message)) {
            $this->Flash->success(__('The message has been saved.'));
            return $this->redirect(['action' => 'index']);
        } else {
            $this->Flash->error(__('The message could not be saved. Please, try again.'));
        }
    }
    $members = $this->Messages->Members->find('list', ['limit' => 200]);
    $this->set(compact('message', 'members'));
    $this->set('_serialize', ['message']);
}

※関連コンテンツ

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