アソシエーション利用のデータアクセス (2) (4/5)
作成:2015-11-14 08:08
更新:2015-11-14 08:08
更新:2015-11-14 08:08
■Messagesのデータ更新
続いて、データの更新です。
これは、editアクションとして用意しておきます。あらかじめフォームを表示したテンプレートを用意しておき、アクセス時にそのフォームに編集するデータの内容を設定しておく。そして送信したら、送られたデータを元にデータを更新する、という流れになります。このあたりは、Membersの更新処理と同じですね。
では、アクションを挙げておきましょう。下のリスト欄に簡単なサンプルコードを用意しておきました。ここでは、まずIDを指定してMessagesデータを取り出しておきます。
例によって、第2引数にはcontainを用意しておきます。が、値は空のままですね。Messagesは、belongs toで関連付けられている(外部キーで、関連するMembersがしっかりと指定されている)ので、containによるMembersの指定は行いません。Membersには外部キーなどの関連するモデルの情報はありませんので、containで「取り出すときは関連するMessagesを含むんだよ」と指定してやったのですね。
後は、送信されたフォームのデータをpatchEntityで$messageにマージし、saveで保存するだけです。
基本的には、新規作成のadd用フォームと同じですね。$this->Form->create($message)というよに、フォーム作成時に$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を指定しておけば、その値を使ってフォームが生成されます。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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 プログラミング入門」に戻る