ORMによるデータの取得[kohana 3.x]

メモ:  Category:php

モデルとデータベース[kohana 3.x]」では、テーブルを指定したり、SQL文を発行して データを取得しましたが、ここではORMを使ってデータを取得してみます。

ORMモジュールを有効にする

ORMモジュールを使用できるように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
    ));

上記例では、データベースとORMのモジュールが有効になっています。

テーブルのルール

基本は、kohanaのORMもCakePHP等と同様にテーブル名をモデル名の複数形にします。プライマリーキーの項目名は idとします。

今回使用するようなtaskモデルでは、テーブル名をtasksとすることでオブジェクトとデータベースのテーブルを対応させることができます。ORMクラスの内部では、モデル名からInflectorというクラスで複数形に変換が行われているようです。

テーブル例

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;

モデルの作成

次にモデルを作成していきます。ORMを使用する場合、モデルはORMクラスを継承して作成します。

application/classes/modelフォルダにtask.phpファイルを作成し、次のようにモデルを作成します。

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

class Model_Task extends ORM{
}

これだけで、テーブル及び項目への関連付けが内部で実行されます。

データを取得する

作成したモデルを使用して、コントロール内でデータを取得します。モデルのインスタンスを生成するには、 次のように定義します。

モデルのインスタンス作成例1

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

class Controller_Task extends Controller_Template_Default
{
    public function action_index()
    {
        $tasks = ORM::factory('task');
    }
}

モデルのインスタンス作成例2

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

class Controller_Task extends Controller_Template_Default
{
    public function action_index()
    {
        $tasks = new Model_Task();
    }
}

インスタンスが生成されたら、データを取得します。ここでは、find_allメソッドを使用して すべてのデータを取得してみます。

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

class Controller_Task extends Controller_Template_Default
{
    public function action_index()
    {
        $tasks = ORM::factory('task');
        $dat['tasks'] = $tasks->find_all();
    }
}

データの取得から表示

データの取得ができるようになったので取得したデータを出力します。find_allメソッドで取得したデータは Database_MySQL_Resultで返され、Database_MySQL_Resultにはイテレータが実装されています。

コントローラからビューまでを実装します。

コントローラーの例

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

class Controller_Task extends Controller_Template_Default
{
    public function action_index()
    {
        $this->template->title            = 'Kohana 3.0 Test Page';
        $this->template->meta_keywords    = 'bnote, Kohana, KO3';
        $this->template->meta_description = 'A test of Kohana';
        $this->template->meta_copywrite   = '';

        $this->template->content          = View::factory('blocks/task')
                                            ->bind('tasks',$tasks);
        $tasks                            = ORM::factory('task')->find_all();
    }
}

ビューの例

foreach文での取得例。

<div class="span-24 last">
<table class="tasks">
<?php foreach($tasks as $task):?>
<tr>
<td><?php echo $task->task;?></td>
<td><?php echo $task->limit;?></td>
</tr>
<?php endforeach;?>
</div>

while文での取得例。

<div class="span-24 last">
<table class="tasks">
<?php while($tasks->valid()):?>
<tr>
<td><?php echo $tasks->get('task');?></td>
<td><?php echo $tasks->get('limit');?></td>
</tr>
<?php $tasks->next();?>
<?php endwhile;?>
</div>

bluenote by BBB