「モデルとデータベース[kohana 3.x]」では、テーブルを指定したり、SQL文を発行して データを取得しましたが、ここでは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{ }
これだけで、テーブル及び項目への関連付けが内部で実行されます。
作成したモデルを使用して、コントロール内でデータを取得します。モデルのインスタンスを生成するには、 次のように定義します。
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Task extends Controller_Template_Default { public function action_index() { $tasks = ORM::factory('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(); } }
インスタンスが生成されたら、データを取得します。ここでは、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>
Copyright 1997-2010 BBB All rights reserved.