Mach3.laBlog

はじめてのKohana (6) : モデルとデータベース

この記事は賞味期限切れです。(更新から1年が経過しています)

「はじめてのKohana」の第六回目です。 Kohanaのモデルとデータベースについて紹介します。

はじめてのKohana

モデルファイル

Kohanaのモデルは次の場所に格納します。

/application/classes/model/

例えば、簡単なDataモデルを作って使用してみます。

/application/classes/model/data.php

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

class Model_Data extends Model {

         public function getItem(){
                    // なにか処理をする
                    return $item;
         }
}

コントローラでインスタンスを作って使用してみましょう。

$model = new Model_Data;
echo $model->getItem();

オートロードのおかげで、設置場所と命名規則さえ守っていれば簡単に使用する事ができますね。

モデル自体については特別これ以上書くことはなさそうなので、
続いてモデルと切っても切れないデータベースアクセスについて紹介します。

データベースの初期設定

Kohanaのデータベースの初期設定は、

/modules/database/config/database.php

にあります。が、これを直接編集はしません。
これを雛形にして下記のパスに独自の設定ファイルを作り、
あとはKohanaに設定をカスケーディングしてもらいます。

cf) Cascading Filesystem | Kohana User Guide

/application/config/database.php

ファイルの中身を見ると分かりますが、
Kohanaは複数のデータベースインスタンスを持ち、それを切り替えて使用する事が出来ます。
つまり、開発用・テスト用・本番用のデータベースアクセスの設定をスイッチング出来るようになっているのです。

詳細な設定内容については、雛形の内容をご参照ください。

cf) Configuration | Kohana User Guide

データベースインスタンスとクエリの実行

データベースインスタンスの取得は、Database::instance( $name ) を使います。
例えば、”development” という名前で設定しておいたデータベースのインスタンスは

$db = Database::instance("development");

このようにして取得する事ができます。
そしてインスタンスの query メソッドを使う事で、そのデータベースにクエリを送信します。

$result = $db->query(Database::SELECT, 'SELECT * FROM mytable');

queryの第一引数(Database::SELECT)は、クエリのタイプです。
SELECT/INSERT/UPDATE/DELETEがあり、それぞれ返す値が異なります。

  • SELECT : Database_MySQL_Result インスタンス
  • INSERT : insert id と列数を含んだarray
  • UPDATE/DELETE : affected rowsの数値

cf) Database | Kohana User Guide

結果を受け取る

Database::SELECTでクエリを送信した場合、結果が Database_MySQL_Result インスタンスで返されます。
この結果を1つずつ舐めて処理していきたい場合、例えば、次のようにします。

$result = $db->query(Database::SELECT, 'SELECT * FROM mytable');

foreach($result->as_array() as $row){
    echo Debug::vars($row);
}

as_array メソッドは、返された結果を連想配列で取得出来ます。

または、配列に変換せずに次のように処理する事もできます。これは上の例と同様の結果が出力されます。

while($result->valid()){ // valid は現在の行が存在するかを返す
    $row = $result->current(); // current は現在の行を返す
    echo Debug::vars($row);
    $result->next(); // next で次の行にポインタを進める
}

$result->rewind(); // rewind で最初の行にポインタを戻す

cf) Database_MySQL_Result | Kohana User Guide

クエリビルダー

データベースインスタンスを使ってクエリを送信する方法の他に、
DBクラスを利用した、より安全な方法が提供されています。
その一つがクエリビルダーです。

クエリビルダーは、メソッドを連ねていく事でクエリを動的に組み立てていくことができます。
CodeIgniterで言う所のActiveRecordのような物ですね。

// クエリの組立
$query = DB::select("id", "name", "created_at")
    ->from("users")
    ->where("id", ">", 3)
    ->where("name", "&lt;>", "foo");

$query->execute(); // executeで実行

上のコードは、次のようなSQLを生成し、送信しています。
生成されるSQLは、$query->__toString(); で確認できます。

SELECT id, name, created_at FROM users WHERE id > 3 AND name <> ‘foo’

ここで挙げた以外にも組立に使える様々なメソッドが用意されています。

cf) Query Builder | Kohana User Guide

プリペアドステートメント

プリペアドステートメントも、クエリビルダー同様にDBクラスから提供されます。

$query = DB::query(Database::SELECT, 'SELECT * FROM `mytable` WHERE id = :id AND name = :name');

// parameters で値を渡す
$query->parameters(array(
    "id" => 123,
    "name" = "foo"
));

// param で1つずつ値を渡すこともできる
$query->param("id", 123);
$query->param("name", "foo");

$result->execute(); // executeで実行

bindによる参照渡し

また、param の代わりに bind を使用すると値渡しではなく参照渡しをする事ができます。
繰り返し同じクエリを処理する場合に便利ですね。

$query = DB::query(Database::SELECT, 'SELECT * FROM `users` WHERE name = :name');
$query->bind(":name", $name);

$names = array( "foo", "bar" );
foreach($names as $name){
    echo Debug::vars($query->__toString());
}

出力結果はこのように。

string(40) “SELECT * FROM users WHERE name = ‘foo’”
string(40) “SELECT * FROM users WHERE name = ‘bar’”

cf) Prepared Statements | Kohana User Guide

DBクラスでのデータベース指定

クエリビルダーやプリペアドステートメントでアクセスするデータベースを選択したい場合は、
executeの引数に設定名またはインスタンスを渡します。

$query->execute("development"); // 生成したクエリをdevelopmentに送信

// または

$db = Database::instance("development");
$query->execute($db);

または、Databaseの静的プロパティを書き換えても行けるようです。
セッターがないのでそういう使い方を想定しているかどうかはわかりません。

Database::$default = "development";

まとめ

Kohanaのモデルとデータベースについてご紹介しました。
次回は、本連載最後になります。Kohanaのバリデーションクラスについてのご紹介です。


» もくじ

  1. Hello World !
  2. コントローラとビューの基本
  3. コントローラ
  4. ルーティング
  5. ビュー
  6. モデルとデータベース
  7. バリデーション

コメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*