アソシエーション利用のデータアクセス (2) (3/5)
作成:2015-11-14 08:06
更新:2015-11-14 08:06
更新:2015-11-14 08:06
■Messagesの新規作成
続いて、Messagesの新規作成です。
これは、addアクションとして用意することにします。下のリスト欄に、簡単なサンプルを掲載しておきました。
ここでは、まず新しいエンティティのインスタンスを作成します。
そして、これに送信されたフォームの内容をマージし、「save」メソッドでその内容を保存します。
処理の流れとしては、基本的なフォーム送信と保存の方法と同じですね。では、テンプレート側に用意するフォームを見てみましょう。
$this->Form->create($message)としてフォームタグを生成し、$this->Form->inputで入力フィールドを作成する、という基本は同じです。ただし、今回は「関連するMembersを設定する」という項目が追加されています。この部分ですね。
そして呼び出すメソッドは、find('list', ['limit' => 200])というように、第1引数に'list'を指定しています。こうすることで、Membersの名前のリストを配列にまとめて取り出すことができます(limitを指定しているので、最大200まで)。listは、データの値を配列として取り出すのに使うものなのです。
「なんでMembersの名前が取り出されるんだ? IDじゃないのか?」と思った人。Membersのテーブル(MembersTable)クラスに、こんな処理を用意していたのを思い出して下さい。
これは、addアクションとして用意することにします。下のリスト欄に、簡単なサンプルを掲載しておきました。
ここでは、まず新しいエンティティのインスタンスを作成します。
$message = $this->Messages->newEntity();
そして、これに送信されたフォームの内容をマージし、「save」メソッドでその内容を保存します。
$message = $this->Messages->patchEntity($message, $this->request->data);
if ($this->Messages->save($message)) ……
処理の流れとしては、基本的なフォーム送信と保存の方法と同じですね。では、テンプレート側に用意するフォームを見てみましょう。
<?= $this->Form->create($message) ?>
<fieldset>
<legend><?= __('Add 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() ?>
$this->Form->create($message)としてフォームタグを生成し、$this->Form->inputで入力フィールドを作成する、という基本は同じです。ただし、今回は「関連するMembersを設定する」という項目が追加されています。この部分ですね。
echo $this->Form->input('members_id', ['options' => $members]);外部キーと同じ、'members_id'という名前で用意しています。第2引数に、'options'として$membersを指定していますね。この変数は、コントローラー側で、$this->Messages->Members->findを使って取り出したものです。Messages内のMembersにあるfindを呼び出す、というところがちょっと変わっています。
そして呼び出すメソッドは、find('list', ['limit' => 200])というように、第1引数に'list'を指定しています。こうすることで、Membersの名前のリストを配列にまとめて取り出すことができます(limitを指定しているので、最大200まで)。listは、データの値を配列として取り出すのに使うものなのです。
「なんでMembersの名前が取り出されるんだ? IDじゃないのか?」と思った人。Membersのテーブル(MembersTable)クラスに、こんな処理を用意していたのを思い出して下さい。
$this->displayField('name');このdisplayFieldで指定した項目の値が、listでは配列として取り出されるようになっているのです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
public function add() { $message = $this->Messages->newEntity(); if ($this->request->is('post')) { $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 プログラミング入門」に戻る