ORMによるデータの取得[kohana 3.x]
「モデルとデータベース[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>