INSERT を使って新しい行を追加する。
実際には、新しいIDを作成する、新しい行を追加する、2手順になる。なので、正確に作るならば新しいIDを作りながら insert をした後に update をしないといけない(競合が発生するため)のだが、まあ、ひとまず作ってみるということで。
■テーブル構造
[code lang=”csharp”]
CREATE TABLE `test` (
`ID` int NOT NULL,
`Name` varchar(100) NOT NULL,
`Age` int DEFAULT NULL,
`UpdateDate` datetime NOT NULL
);
[/code]
ID は auto_incriment を使ってもいいのだが、ここはそのまま int で。
データ同期が発生する…ってのを考慮して、UpdateDate の列を作っておく。
■Model
新しい ID を作るための GetNewId メソッドだけ作っておく。
[code lang=”php”]
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’];
}
}
[/code]
そういえば、行数で苦労している人もいるみたいなのだが、$this->query をした後に RowCount すると遅くなる(無駄な行を検索する)ので、SQL の COUNT 関数を使う。
[code lang=”php”]
function GetCount() {
$sql = "SELECT count(id) as CNT FROM Test";
$ret = $this->query($sql);
return $ret[0][0][‘CNT’];
}
[/code]
な感じにすれば OK。適宜、WHERE 句を付け加えることになるが…これはまた別途考える。
■Controller
確認用に index メソッドで検索できるようにしておく。
insert メソッドが挿入部分。
in Controller/TestController.php
[code lang=”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(‘.’);
}
}
[/code]
ID を $this->set しているのは確認のため。
新しい行を、$data = array で作成して、save の順で呼び出し。ID を自分で作成しているので create は呼び出す必要はないかも…後で調べる。
$data の中身は、本来はクライアントから Web API で送るパターン。簡単な文字列ならば URL でよいのだが、ここは POST に統一しておくのが便利だと思う。
日付はサーバー日時で統一するために、PHP 側で生成。date(‘c’) すれば ok。
挿入後に index へリダイレクトしてもよいのだが、ここでは確認のために insert をそのまま表示。
■View
[code lang=”php”]
<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 ; ?>
[/code]
■結果
挿入した行が表示される。
※この結果は GMT が間違っているので、後で直す。
