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

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

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