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

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

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

■Messagesの新規作成

続いて、Messagesの新規作成です。

これは、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では配列として取り出されるようになっているのです。

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

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 プログラミング入門」に戻る