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

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

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

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

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

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

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

■場所
\htdocs\chococake\src\Template\Heroes
■ファイル名
add.ctp

<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() ?>

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

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

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

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

<?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->Heroes->save($hero)) {
        return $this->redirect(['action' => 'index']);
      }
    }
  }

}

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

http://localhost/chococake/heroes/add

解説

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

$this->request->is('post')

「Request」プロパティの「is」メソッドで POST 送信か否かをチェック。

$hero = $this->Heroes->newEntity();

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

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

$hero = $this->Heroes->patchEntity($hero, $this->request->data);

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

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

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

$this->Heroes->save($hero)

モデル名「Heroes」にある「save」メソッドで、エンティティーを保存する。
「save」メソッドの引数にエンティティーデータを渡すと、データに問題がなければテーブルに保存される。

return $this->redirect(['action' => 'index']);

正常に保存ができると、「save」メソッドは「true」を返す。
「true」であれば if 文内のリダイレクト処理を行う。

動作確認

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

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

CakePHP の一覧