ひとり勉強ログ

ITエンジニアの勉強したことメモ

#06 データベース操作の基本 Create:新規作成

前回、「Heroes」モデルを作成した。これを使用し、今回はデータベースへのアクセスの基本を行う。

  • Create:新規作成
  • Read:データの取得
  • Update:データの更新
  • Delete:データの削除

まず、データの新規作成「Create」を行っていく。 モデル名が「Heroes」なので、アプリケーション名も必然的に「Heroes」となる。

ビューテンプレートのファイル作成

「\htdocs\chococake\src\Template」内に「Heroes」というフォルダを作成、その中に「add.ctp」というファイル名でファイルを作成する。

フォーム生成部分の記述を行う。

■場所 \htdocs\chococake\src\Template\Heroes ■ファイル名 add.ctp [php] <h1>新規登録</h1>

<!-- フォーム開始タグ --> <?= $this->Form->create() ?>

<!-- フォームの入力内容をグループ化するタグ --> <fieldset> <!-- 各入力フィールドのinputタグ --> <?php echo $this->Form->input('name') ?> <?php echo $this->Form->input('power') ?> <?php echo $this->Form->input('country') ?> </fieldset>

<!-- 送信ボタンのタグ --> <?= $this->Form->button('登録') ?>

<!-- フォーム終了タグ --> <?= $this->Form->end() ?> [/php]

Heroes」コントローラーを作成

「\htdocs\chococake\src\Controller」内に「HeroesController.php」というファイルを作成。

■場所 \htdocs\chococake\src\Controller ■ファイル名 HeroesController.php

以下のように add アクションを作成。

[php] <?php namespace App\Controller;

use App\Controller\AppController;

/* * / class HeroesController extends AppController { public function add() { if ($this->request->is('post')) { $hero = $this->Heroes->newEntity(); $hero = $this->Heroes->patchEntity($hero, $this->request->data);

  if ($this-&gt;Heroes-&gt;save($hero)) {
    return $this-&gt;redirect(['action' =&gt; 'index']);
  }
}

}

} [/php]

以下URLにアクセスするとフォームが表示される。

http://localhost/chococake/heroes/add

解説

「add」メソッド内を解説。

[php] $this->request->is('post') [/php] 「Request」プロパティの「is」メソッドで POST 送信か否かをチェック。

[php] $hero = $this->Heroes->newEntity(); [/php] 「$this」でコントローラー自身にある「Heroes」内のメソッドを呼び出し、新しいエンティティーを作成。 「Heroes」というモデルを作成しているため、「Heroes」という名前のプロパティが用意されている。

Heroes」プロパティには「HeroesTable」クラスのインスタンスが入っている。 「newEntity」メソッドを呼び出すとエンティティーが作成される。

[php] $hero = $this->Heroes->patchEntity($hero, $this->request->data); [/php] 作成されたエンティティーのデータは値も設定されていない。 「patchEntity」メソッドで、第1引数に指定した「$hero」エンティティーに、第2引数「$this->request->data」のデータをマージしている。

第2引数「$this->request->data」の、「data」プロパティは、送信されたフォームの値がまとめて連想配列で格納されている。 この連想配列データを $hero (既存のエンティティー)にマージしている。

フォームヘルパーを利用しているため、「patchEntity」でフォームの値をエンティティーに容易にマージすることができる。

[php] $this->Heroes->save($hero) [/php] モデル名「Heroes」にある「save」メソッドで、エンティティーを保存する。 「save」メソッドの引数にエンティティーデータを渡すと、データに問題がなければテーブルに保存される。

[php] return $this->redirect(['action' => 'index']); [/php] 正常に保存ができると、「save」メソッドは「true」を返す。 「true」であれば if 文内のリダイレクト処理を行う。

動作確認

本フォームに、以下の内容でデータベースに登録が確認できればOK。

Name : キン肉マン Power : 95 Country : キン肉星