モデルとデータベース[kohana 3.x]

メモ:  Category:php

ここでは、モデルとデータベースの使い方を勉強してみます。

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);
    }
}

コントローラー側では、モデルのインスタンスを作成し、データを取得します。

[サンプルファイル]

bluenote by BBB