読者です 読者をやめる 読者になる 読者になる

Motomichi Works Blog

その日学習したことについて書いている日記です。誰かの役に立ったらそれはそれで嬉しいです。

vagrantその19-28 cakephp入門をやってみる(データを追加する)INSERT

制作 vagrant cakephp

参考にさせて頂いたページ

データの追加・更新・削除(1/3):初心者のためのCakePHP2.0 プログラミング入門

add.ctpの作成とその記述内容

参考ページにならって以下の通りですが、データベースに入っているデータの表示もしたいので、自分なりに追記しています。

<h1>Add Page</h1>
<p>MySampleData Add Form.</p>
<?php
echo $this->Form->create('MySampleData');
echo $this->Form->input('name');
echo $this->Form->input('mail');
echo $this->Form->input('tel');
echo $this->Form->end('Submit');
?>

<table>
<?php foreach ($datas as $data): ?>
  <tr>
    <td><?php echo $data['MySampleData']['id']; ?></td>
    <td><?php echo $data['MySampleData']['name']; ?></td>
    <td><?php echo $data['MySampleData']['mail']; ?></td>
    <td><?php echo $data['MySampleData']['tel']; ?></td>
  </tr>
<?php endforeach; ?>
</table>

MySampleDatasController.phpの記述内容

参考ページにならって以下の通り。
ここまでやってきたindexとfindに続いて、addアクションを追記した。
自分なりにViewに追記したテーブル表示のために、データ取得処理も記述している。

<?php
App::uses('AppController', 'Controller');

class MySampleDatasController extends AppController {
  function index(){
    // レイアウト関係
    $this->layout = "Sample";
    $this->set("header_for_layout","Sample Application");
    $this->set("footer_for_layout","copyright by SYODA-Tuyano. 2011.");
    // 以下がデータベース関係
    $datas = $this->MySampleData->find('all');
    $this->set('datas',$datas);
  }
  function find(){
    $this->set("header_for_layout","Sample Application");
    $this->set("footer_for_layout","copyright by SYODA-Tuyano. 2011.");
    if (isset($this->data['id'])){
      //find.tplでsubmitした文字列を$idに格納
      $id = $this->data['id'];
      //MySampleDataモデルクラスのレコードのうち、idが$idと等しいレコードを$statusに格納
      $status = array(
        'conditions' => array(
          'MySampleData.id' => $id
        )
      );
      //$statusに入っている最初の要素を$dataに格納
      $data = $this->MySampleData->find('first', $status);
    } else {
      $data = null;
    }
    //$dataをset
    $this->set('data',$data);
  }
  public function add() {
    // レイアウト関係
    $this->layout = "Sample";
    $this->set("header_for_layout", "Sample Application");
    $this->set("footer_for_layout", 
        "copyright by SYODA-Tuyano. 2011.");
    // post時の処理
    if ($this->request->is('post')) {
      $this->MySampleData->save($this->request->data);
    }
    // 表示用にテーブルのデータを取得してset
    // Model/MySampleData.phpの中の、MySampleDataクラスと同名のプロパティが用意される仕組みらしい。
    // find('all')もextendされたメソッド。
    $datas = $this->MySampleData->find('all');
    $this->set('datas',$datas);
  }
}

このコードについて

以下の記述でform要素の開始タグを生成

//echo $this->Form->create(Model名の指定);
echo $this->Form->create('MySampleData');

以下の記述で、input要素を生成

echo $this->Form->input('name');
echo $this->Form->input('mail');
echo $this->Form->input('tel');

以下の記述で、ボタンとformの終了タグを生成

echo $this->Form->end('Submit');

参考ページによると、echo $this->Form->create('');の記述でform開始タグを生成した場合は、このページ(アクション)自身にデータが送信されるとのこと。action属性の設定の仕方もあるんだろうけど、今日はいいや。

参考ページによるとif ($this->request->is('post'))の記述で、このページへのアクセスがGETかPOSTかを判定しています。

以下の記述で、テーブルにデータをINSERTしています。

$this->MySampleData->save($this->request->data);

INSERT文とか自分で書かなくていいし簡単。

参考ページによると

コントローラーでは、$thisにModelクラスと同名のプロパティが用意され、そこにModelが設定されていました。この「save」を呼び出すと、新しいデータを保存します。引数には、$this->request->dataを指定します。このdataには、送信されたフォームの情報がまとめられています。たったこれだけで、送信したデータをデータベースに保存することができてしまうのです。

とのことです。

モデルのこと

いまのところあまり理解していないけど、今ある事実だけまとめると以下の通り。

  • app/Model/MySampleData.php
  • その中のクラス名もMySampleData
  • アンダースコア区切りだけどテーブル名もmy_sample_data

モデルファイル名と、クラス名と、テーブル名、このあたりのルールと使い方をきちんと理解するのは今後の課題。
3つ揃えるのが基本的なルールなのかな?

データベース名は参考ページにならってMySampleDataとしているけど、たぶん何かに揃える必要はなくて、database.phpに任意のデータベース名を書けば良さそう。

今日のこのままの実装だと、ページ更新するたびにINSERTされてしまうし、問題はあるんだけど、練習なのでとりあえず良い。

とりあえずINSERTとSELECTできるような感じになってきたので、今回はここまで。

次回はUPDATEかな。