gikoha’s blog

個人的メモがわり

DataMapper ORM

CodeIgniter 2.0.x に対応した DataMapper ORM を試してみた。

まずdatabaseを用意し、tableを用意する
本当はクラス名=table名がいいのだが、ここではめんどくさかったので変えてみた

#  テーブルdiseaseについて
mysql> show columns from disease;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| ID         | int(11)     | NO   | PRI | 0       |       |
| name       | varchar(64) | YES  |     | NULL    |       |
| disease    | varchar(64) | YES  |     | NULL    |       |
| age        | int(11)     | YES  |     | NULL    |       |
..

mysql> SELECT ID,disease,age FROM disease LIMIT 1 OFFSET 0;
+-------+-------------------+------+
| ID    | disease           | age  |
+-------+-------------------+------+
| 62170 | OMI #3 #11 Cypher |   80 |
+-------+-------------------+------+
1 row in set (0.00 sec)
patient.php
<?php
// models/patient.phpとして保存
class Patient extends DataMapper {
	var $table = 'disease';		// テーブル名を指定
	var $validation = array(
		'id' => array(
			'rules' => array('required'),
			'label' => 'ID'
		),
		'name' => array(
			'rules' => array('max_length' => 64),
			'label' => 'Patient name'
		),
		'disease' => array(
			'rules' => array('max_length' => 64),
			'label' => 'Disease'
		),
		'age' => array(
			'rules' => array(),
			'label' => 'Age'
		),
	);
};

テスト用

	function index()
	{
		// create a temporary user object
		$g = new Patient();
		$g->get(1,0);
		printf("%d %s %d", $g->ID, $g->disease, $g->age);

表示例

62170 'OMI #3 #11 Cypher' 80

レコード単位でやるならそれこそActiveRecordクラスでそこそこORMしていて十分。
たぶんrelationalなデータ構造になった場合が違うのかもしれない。