INSERT を使って新しい行を追加する。
実際には、新しいIDを作成する、新しい行を追加する、2手順になる。なので、正確に作るならば新しいIDを作りながら insert をした後に update をしないといけない(競合が発生するため)のだが、まあ、ひとまず作ってみるということで。
■テーブル構造
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 メソッドだけ作っておく。
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 関数を使う。
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
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
<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 が間違っているので、後で直す。

