INSERT を使って新しい行を追加する。
実際には、新しいIDを作成する、新しい行を追加する、2手順になる。なので、正確に作るならば新しいIDを作りながら insert をした後に update をしないといけない(競合が発生するため)のだが、まあ、ひとまず作ってみるということで。
■テーブル構造
1 2 3 4 5 6 | CREATE TABLE `test` ( `ID` int NOT NULL, `Name` varchar(100) NOT NULL, `Age` int DEFAULT NULL, `UpdateDate` datetime NOT NULL ); |
ID は auto_incriment を使ってもいいのだが、ここはそのまま int で。
データ同期が発生する…ってのを考慮して、UpdateDate の列を作っておく。
■Model
新しい ID を作るための GetNewId メソッドだけ作っておく。
1 2 3 4 5 6 7 8 9 | class Test extends AppModel { var $useTable = 'Test' ; function GetNewId() { $sql = "SELECT max(id)+1 as ID FROM Test" ; $ret = $this ->query( $sql ); return $ret [0][0][ 'ID' ]; } } |
そういえば、行数で苦労している人もいるみたいなのだが、$this->query をした後に RowCount すると遅くなる(無駄な行を検索する)ので、SQL の COUNT 関数を使う。
1 2 3 4 5 | function GetCount() { $sql = "SELECT count(id) as CNT FROM Test" ; $ret = $this ->query( $sql ); return $ret [0][0][ 'CNT' ]; } |
な感じにすれば OK。適宜、WHERE 句を付け加えることになるが…これはまた別途考える。
■Controller
確認用に index メソッドで検索できるようにしておく。
insert メソッドが挿入部分。
in Controller/TestController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class TestController extends AppController { public function index() { $id = null; if (isset( $this ->params[ 'url' ][ 'id' ])) $id = $this ->params[ 'url' ][ 'id' ]; if ( $id != null ) { $this ->set( 'Test' , $this ->Test->findAllById( $id )); } else { $this ->set( 'Test' , $this ->Test->find( 'all' )); } } public function insert() { $id = $this ->Test->GetNewId(); $this ->set( 'ID' , $id ); $data = array ( 'ID' => $id , 'Name' => 'tomoaki' , 'Age' => 20, 'UpdateDate' => date ( 'c' )); // $this->Test->create(); $this ->Test->save( $data ); $this ->set( 'Test' , $this ->Test->find( 'all' )); // $this->redirect('.'); } } |
ID を $this->set しているのは確認のため。
新しい行を、$data = array で作成して、save の順で呼び出し。ID を自分で作成しているので create は呼び出す必要はないかも…後で調べる。
$data の中身は、本来はクライアントから Web API で送るパターン。簡単な文字列ならば URL でよいのだが、ここは POST に統一しておくのが便利だと思う。
日付はサーバー日時で統一するために、PHP 側で生成。date(‘c’) すれば ok。
挿入後に index へリダイレクトしてもよいのだが、ここでは確認のために insert をそのまま表示。
■View
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <h2>Test list</h2> <?php echo "new id: $ID <br />" ; ?> <table> <tr> <td>ID</td> <td>Name</td> <td>Age</td> <td>UpdateDate</td> </tr> <?php foreach ( $Test as $item ) : ?> <tr> <td><?php echo $item [ 'Test' ][ 'ID' ] ?></td> <td><?php echo $item [ 'Test' ][ 'Name' ] ?></td> <td><?php echo $item [ 'Test' ][ 'Age' ] ?></td> <td><?php echo $item [ 'Test' ][ 'UpdateDate' ] ?></td> </tr> <?php endforeach ; ?> |
■結果
挿入した行が表示される。
※この結果は GMT が間違っているので、後で直す。