Daomancy - Simplematic O/R Mapper for PHP
Daomancyは、一目でわかるインタフェースで、DBからデータオブジェクトを生成するデータアクセスフレームワークなのです。
とりあえず下のソースコードを見てください。
$page = Daomancy::_($dbh)
->from('PageDAO' , 'p')
->join('CategoryDAO' , 'c')
->on('p.category_id = c.category_id')
->where('p.name LIKE ?' , 'Daomancy%')
->and_('c.category_id = ?' , '1')
->fetch();
なにができるか、わかったでしょうか。こういうことをします。
上の例では、DB上のpageテーブルとcategoryテーブルからそれぞれPageDAOオブジェクトとCategoryDAOオブジェクトを生成しているのです。
見てのとおり、SQLをある程度知っていれば誰にでもすぐにわかります。
オブジェクト指向を導入してもっともうれしいのはデータアクセス処理です。しかし、実現方法をいろいろ考えてみると難しいです。
Daomancyでは、オブジェクトの単位をばっさりとテーブル別に分けてしまいました。その代わり、上の例のようにオブジェクトを結合して生成できます。
特徴
-
オブジェクトは完全にテーブル別
設計に悩む必要はありません。わかりやすいです。
-
アクティブレコード
データオブジェクトはテーブルの1行につきひとつ生成され、このオブジェクトの中には「update」「delete」「insert」メソッドが備わっています。いわゆるアクティブレコードと呼ばれるパターンです。
また、データと関連の深いビジネスロジックをこのオブジェクトのメソッドに含めてしまうことができます。(例:性と名から氏名を取得、生年月日から年齢を取得など)
-
自由に結合できる
上の例にあるとおり、JOINできます。テーブル別の処理はアクティブレコードに書いておき、あとは各モジュールで柔軟に、それらを結合して扱うことができます。
つかいかたの例
簡単な例です。
require_once 'Daomancy.php';
require_once 'PageDAO.php'; //取得に使うクラスは読みこんでおきます
require_once 'CategoryDAO.php';
$dbh = new PDO(DSN); //PDOを使います
$page = Daomancy::_($dbh)
->from('PageDAO' , 'p')
->join('CategoryDAO' , 'c')
->on('p.category_id = c.category_id')
->where('p.name LIKE ?' , 'Daomancy%')
->and_('c.category_id = ?' , '1')
->orderBy('p.category_id ASC , p.page_id ASC')
->limit(10)
->offset(0)
->fetchAll();
これをHTMLに表示してみます。
まずはHTML特殊文字をエスケープしなければなりません。
ここでは、パッケージの中についでに入っているMultiWrapperを使ってみます。
Ethnaなど気の利いたフレームワークを使っているなら、フレームワークが提供するエスケープ処理を使えばいいです。
$mw = new MultiWrapper('htmlspecialchars'); //エスケープ処理
$page = $mw->wrap($page);
じっさいにはテンプレートエンジンなど使うことも多いと思いますが、ここでは素のPHPで。
HTMLは下のような感じになるでしょう。
<table>
<? foreach($page as $v): ?>
<tr>
<td>
<? if($v->p->isNew(): ?>
<img src="new.gif" />
<? endif ?>
<?= $v->p->page_id ?>
</td>
<td>
<?= $v->p->name ?>
</td>
<td>
<?= $v->c->name ?>
</td>
</tr>
<? endforeach ?>
</table>
ある程度のロジックは各アクティブレコードに書いてしまうことができるので(上の例のisNew())、簡単な画面ならDaomancyで取得したものをエスケープするだけでプログラムは完成です。
クラス一覧
-
Daomancy
SELECT文を生成し実行して、指定したDaomancyRecordにマッピングします。
-
DaomancyRecord
各テーブルごとのアクティブレコードオブジェクトの基底クラスです。
列名と同じ名前のpublicフィールドを持っています。
テーブルひとつが対象であればこれ単独で動きます。
テーブル名、列名、プライマリキーの定義を記述すればとりあえず動きますが、さらにメソッドを追加することができます。
-
DaomancyRecordRack
JOINして取得したDaomancyRecordを行ごとに保持します。
-
Fromancy
FROM句を生成するためにDaomancyが内部で使用しています。
-
Wheremancy
WHERE句を生成するためにDaomancyが内部で使用しています。
また、これを使用することでIN句やNOT NULL句などを生成することができます。
-
WheremancyLiteral
プレースホルダ「?」を使用せず直接WHERE句を記述するときに使います。
-
MultiWrapper
本体とは特に関係ありませんが、ついでに入っています。配列やオブジェクトなどあらゆるものの各要素を、形式を保持したままhtmlspecialcharsします。
Daomancyが生成したオブジェクトをHTML表示に使用する場合は役にたつかもしれません。