CakePHP の scaffold 応用編を通して使いどころを少しだけ考えます! | oki2a24 の次の投稿となります。
コントローラーとビューを使ってテーブルデータ操作の基本を学習します。モデルの作成は行いません。
ポイント
- DB データの登録、検索や削除などの操作は、コントローラーから行なう。モデル、ではない。
- $this->モデル名->関数、で操作する。DB にテーブルがあれば、モデルはなくても大丈夫です。
- 検索の find 関数の第1引数による動きまとめ
- find(‘all’); 全レコードを得ます。
- find(‘first’); 最初の1レコードを得ます。
- find(‘list’); レコードのリストを得ます。
- find(‘count’); レコード数を得ます。
- find 関数で得られる結果の構造は第1引数のタイプによりそれぞれ異なります。
- find 関数第2引数の conditions で検索条件を指定できます。
- 削除。delete(削除する行の id )
- 挿入または更新。save(保存するデータ)
前提
- CakePHP 2.1.3 導入済み。
- ドキュメントルート/cake/sample/(ここにCakePHP が入ってます。app ディレクトリとか、.travis.yml ファイルとか。)
ソース
cake/sample/app/Controller/BoardsController.php
<?php class BoardsController extends AppController { public $name = 'Boards'; // public $scaffold; /** * 初期表示と検索結果をセットするアクション */ public function index() { // 初期化 $data = null; $first = null; $list = null; $count = null; if (!empty($this->data)) { // Bords テーブルを id で検索 $data = $this->Board->find('all', array( 'conditions' => array( 'Board.id' => $this->data['Board']['id'] ) ) ); } else { // 初期表示。find 関数の第1引数の働きを確認 $data = $this->Board->find('all'); $first = $this->Board->find('first'); $list = $this->Board->find('list'); $count = $this->Board->find('count'); } // ビューで使えるように DB データをセット $this->set('data', $data); $this->set('first', $first); $this->set('list', $list); $this->set('count', $count); } /** * Boards テーブルにデータ追加 */ public function addRecord() { if (!empty($this->data)) { $this->Board->save($this->data); } $this->redirect('index'); } /** * Boards テーブルのデータを削除。id で指定。 */ public function delRecord() { if (!empty($this->data)) { $this->Board->delete($this->data['Board']['id']); }; $this->redirect('index'); } } ?>
index アクションで最初の表示、そして検索したときの処理を書いています。addRecord アクションでデータの追加と更新、delRecord アクションでデータの削除を行っています。
cake/sample/app/View/Boards/index.ctp
<h1>送信フォーム・サンプル</h1> <h2>検索</h2> <?php echo $this->Form->create(false, array('type' => 'post', 'action' => 'index')); echo $this->Form->text('Board.id'); echo $this->Form->submit('送信'); echo $this->Form->end(); ?> <br /> <hr> <br /> <h2>登録・更新</h2> <?php echo $this->Form->create(false, array('type' => 'post', 'action' => 'addRecord')); echo $this->Form->text('Board.id'); echo $this->Form->text('Board.name', array('value' => $data[0]['Board']['name'])); echo $this->Form->text('Board.title', array('value' => $data[0]['Board']['title'])); echo $this->Form->textarea('Board.content', array('value' => $data[0]['Board']['content'])); echo $this->Form->submit('送信'); echo $this->Form->end(); ?> <br /> <hr> <br /> <h2>削除</h2> <?php echo $this->Form->create(false, array('type' => 'post', 'action' => 'delRecord')); echo $this->Form->text('Board.id'); echo $this->Form->submit('送信'); echo $this->Form->end(); ?> <br /> <hr> <br /> <table> <?php for($i = 0; $i < count($data); $i++) { $arr = $data[$i]['Board']; echo "<tr><td>{$arr['id']}</td>"; echo "<td>{$arr['name']}</td>"; echo "<td>{$arr['title']}</td>"; echo "<td>{$arr['content']}</td></tr>"; } ?> </table> <br /> <hr> <br /> <p>all etc</p> <pre> <?php print_r($data); ?> </pre> <br /> <hr> <br /> <p>first</p> <pre> <?php print_r($first); ?> </pre> <br /> <hr> <br /> <p>list</p> <pre> <?php print_r($list); ?> </pre> <br /> <hr> <br /> <p>count</p> <pre> <?php print_r($count); ?> </pre>
$this->Form->text 関数の第2引数にタグの要素を指定することができます。value を指定しています。HTML ソースは、<input value=”テキストタグ★”> という形になります。これで、コントローラーで指定した情報をビューで表示させて、データ更新のときに楽をしよう!そういう算段でございます。公式ドキュメントの FormHelper::text(string $name, array $options) 説明はこちらです。
また、同様のことを $this->Form->textarea 関数でも同様に value に指定をしています。ただし、この場合は textarea の開始、終了タグの間に表示されます。つまり、<textarea value=”テキストエリアタグ★”></textarea> ではなく、<textarea>テキストエリアタグ★</textarea> となります。公式ドキュメントの FormHelper::textarea(string $fieldName, array $options) 説明はこちらです。こちらの関数は、行数などの指定もできるようで、迷ったらぜひ見ましょう!
また、一番下の print_r で、find(‘all’);、find(‘first’);、find(‘list’);、find(‘count’); のデータを表示しています。
結果
http://localhost/cake/sample/boards にアクセスします。画面を分割して表示します。
検索、登録・更新、削除用のフォームと続きまして、一番下に一覧表です。
次に、find(‘all’);、find(‘first’);、find(‘list’);、find(‘count’); を print_r で表示した情報です。それぞれ構造が違いますね。find の all が一番階層が深くて3次元連想配列、次に firstが2次元連想配列、listが1階層の連想配列、count は階層なし!です。
最後に、自動で表示される項目です。SQL 文、つまり実行したクエリを表示してくれます。コントローラーに書いた検索条件などが、正しいかどうか、一目でわかりますね!便利です♪
「CakePHP2。モデル未使用でデータベースデータ操作の基本を学習します♪」への4件の返信
[…] CakePHP。モデル未使用でデータベースデータ操作の基本を学習します♪ | oki2a24 の次の投稿となります。 […]
[…] 以前ひとつのテーブルからのデータ取得を行いました。それも、モデルなしで。今回はモデルをしっかり使って、そしてテーブルは複数を連携させて、という例となります。2つのテーブ […]
参考させていただきました。
こちらは、秀和のと同じようですが、本のように追加メソッドとは違いますが、
delRecordの前記は必要になるのですか?
ご質問ありがとう存じます。
「前記」の解釈が難しく感じられましたけれども、index() があればそれ以外の delRecord() の前に記されたメソッドが無くとも動きますの。詳しくは投稿いたしましたのでご参照いただけたら幸いに存じます。
CakePHP2 のアクションが無い場合のエラー内容★ご質問の調査★ | oki2a24