[CakePHP] 新しい行を挿入する

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 が間違っているので、後で直す。

カテゴリー: CakePHP パーマリンク