dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

kohanaのテスト5・・・DBを操作する第2の書き方

今夜のお題は DB 操作の第2の書き方です。テスト4では DB::query を使って SQL文を直接書く方法を使いました。テスト5では Query Builder を使う方法です。Query Builderには DB::select、DB::insert、DB::update、DB::delete などがあります。テスト5の機能はテスト4と全く同じです。インサートとアップデートのメソッドでは、SQL文のパラメータに変数をバインドする方式を敢えて使っています。一度発行したクエリを変数の値を変えながら繰り返し利用する場合に大変便利だと思います。

では本日のサンプルコードです。

・application/classes/controller/test5.php
 クラス名と呼び出すモデル名を変更しただけです。

<?php defined('SYSPATH') OR die('No direct access allowed.');

class Controller_Test5 extends Controller { //コントローラ

    public function action_index() {

        $dat = new Model_Test5; // モデル
        $message = "";

        if (isset($_POST['operation'])) {

            $select = $_POST['operation'];

            switch ($select) {
                case 'insert':
                    $dat->insertData();
                    $message = "データを追加しました";
                    break;
                case 'update':
                    $dat->updateData();
                    $message = "データをアップデートしました";
                    break;
                case 'delete':
                    $dat->deleteData();
                    $message = "データを削除しました";
                    break;
                default:
                    $message = "データを表示しました";
                    break;
            }
        }

        $result = $dat->selectData();

        // ビュー
        $view = new View('test3'); // テンプレートtest3をビューにセット
        $view->message = $message; // 変数$messageをセット
        $view->content = new View('test4table'); // 変数$contentにビューを入れ子にする
        $view->content->data = $result; // テンプレートtest2tableの$dataにモデルの結果を代入する
        $view->post = new View('test3post'); // 変数$postにビューを入れ子にする
        $this->response->body($view); // ビューを表示する
    }

}

?>

 ・application/classes/model/test5.php

<?php defined('SYSPATH') or die('No direct script access.');

class Model_Test5 {

    function selectData() {
        $result = DB::select()
                ->from('test2')
                ->select('*')
                ->execute();
        return $result;
    }

    function insertData() {
        $id = '';
        $name = $_POST['name'];
        $address = $_POST['address'];
        $tel = $_POST['tel'];
        $query = DB::insert('test2')
                ->columns(array('id', 'name', 'address', 'tel'))
                ->values(array(':id', ':name', ':address', ':tel'))
                ->bind(':id', $id)
                ->bind(':name', $name)
                ->bind(':address', $address)
                ->bind(':tel', $tel);
        $result = $query->execute();
        return $result;
    }

    public function updateData() {
        $id = $_POST['id'];
        $name = $_POST['name'];
        $address = $_POST['address'];
        $tel = $_POST['tel'];
        $query = DB::update('test2')
                ->set(array('id' => ':id', 'name' => ':name',
                    'address' => ':address', 'tel' => ':tel'))
                ->where('id', '=', ':id')
                ->bind(':id', $id)
                ->bind(':name', $name)
                ->bind(':address', $address)
                ->bind(':tel', $tel);
        $result = $query->execute();
        return $result;
    }

    public function deleteData() {
        $id = $_POST['id'];
        $query = DB::delete('test2')
                ->where('id', '=', ':id')
                ->bind(':id', $id);
        $result = $query->execute();
        return $result;
    }

}

?>

 この書き方ですと SQL文を全く知らなくても書けそうです。変数のバインド方式を使わなければ非常にシンプルになりますね。