モデルとデータベース[kohana 3.x]
ここでは、モデルとデータベースの使い方を勉強してみます。
kohanaのモデルはとてもシンプルで、基底クラスではデータベースの接続のみを受け持っています。
abstract class Kohana_Model {
public static function factory($name, $db = NULL)
{
// Add the model prefix
$class = 'Model_'.$name;
return new $class($db);
}
// Database instance
protected $_db = 'default';
public function __construct($db = NULL)
{
if ($db !== NULL)
{
// Set the database instance name
$this->_db = $db;
}
if (is_string($this->_db))
{
// Load the database
$this->_db = Database::instance($this->_db);
}
}
} // End Model
モデルのインスタンスが生成されると、データベース接続のインスタンスを取得しに行くといった 感じでしょうか。
データベースモジュールの使用
kohanaでデータベースに接続するには、application/bootstrap.phpの使用するモジュールへ データベースを追加します。
Kohana::modules(array(
// 'auth' => MODPATH.'auth', // Basic authentication
// 'codebench' => MODPATH.'codebench', // Benchmarking tool
'database' => MODPATH.'database', // Database access
// 'image' => MODPATH.'image', // Image manipulation
// 'orm' => MODPATH.'orm', // Object Relationship Mapping
// 'pagination' => MODPATH.'pagination', // Paging of results
// 'userguide' => MODPATH.'userguide', // User guide and API documentation
));
インストール直後の状態では、コメントアウトされているので上記の部分を修正します。
次にデータベースへの接続設定を定義します。modules/database/config/database.phpをapplication/config/へコピーして データベース接続できるよう修正します。
return array
(
'default' => array
(
'type' => 'mysql',
'connection' => array(
'hostname' => 'localhost',
'username' => 'ユーザー名',
'password' => 'パスワード',
'persistent' => FALSE,
'database' => '接続先データベース',
),
'table_prefix' => '',
'charset' => 'utf8',
'caching' => FALSE,
'profiling' => TRUE,
),
・・・
ここでは、例としてタスクを登録するtasksテーブルを作成してモデルを通してデータを取得してみます。 接続設定で指定したデータベースに次のテーブルを作成します。
CREATE TABLE `tasks` (
`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`task` VARCHAR(128) DEFAULT NULL,
`limit` DATETIME,
`status` INT,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `tasks` (`task`,`limit`,`status`)
VALUES ('kohanaのORM','2010/05/21 17:00:00',0);
INSERT INTO `tasks` (`task`,`limit`,`status`)
VALUES ('kohanaの調査報告','2010/05/28 15:10:00',0);
モデルの作成
application/classesフォルダにmodelフォルダを作成し、タスクのモデルクラスを作成します。 Modelを継承してModel_Taskクラスを次のように作成します。
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Task extends Kohana_Model{
public function __construct()
{
parent::__construct();
}
public function getTopTenTasks()
{
return DB::select()->from('tasks')->limit(10)->execute()->as_array();
}
}
tasksテーブルから10件取得するメソッドを作成しデータベースからデータを取得します。
他にも下記のようにSQL文を作成してリクエストすることもできるようです。
public function getTopTenTasks()
{
$sql = 'SELECT * '."\n".
'FROM `tasks`'."\n".
'LIMIT 0, 10';
return $this->_db->query(Database::SELECT, $sql, FALSE)->as_array();
}
コントローラの作成
コントローラーでModel_Taskのインスタンスを作成し、タスクデータを取得後ビューで表示します。
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Task extends Controller_Template_Default
{
public function action_index()
{
$tasks = new Model_Task();
$dat['tasks'] = $tasks->getTopTenTasks();
$this->template->content = View::factory('blocks/task', $dat);
}
}
コントローラー側では、モデルのインスタンスを作成し、データを取得します。
[サンプルファイル]