O/Rマッパー公開

Maple Wikiの方でO/Rマッパーを公開しました。名前は挑戦的に「ActiveGateway」としました。(ActiveRecordにインス(ry)

http://kunit.jp/maple/wiki/index.php?%B3%C8%C4%A5%2FDb%2FActiveGateway

Ruby on RailsActiveRecordのように手軽にDBアクセスができんやろうかということを目標にPHP4でできる自然な形ということで今のものにとりあえず落ち着きました。

以下のような特徴があります。

  • DBアクセスは全てActiveGatewayオブジェクト経由で行う。
  • あらかじめベースクラスを継承したクラスを準備する必要はない(今後の拡張によって必要に応じてそういったクラスを使用できるようにはするつもり)。
  • 各メソッドの第1引数でテーブル名を指定する
  • ActiveRecordっぽいメソッドをいろいろ用意している
  • OneToOne/OneToMany/ManyToManyな関係を表すために設定ファイル(ini形式)を使用する(設定内容は目を細めると本家ActiveRecordのようにみえる?)。
  • 準備しているメソッドで対応できない場合はexecuteQuery/executeUpdate/txという低レベルアクセスメソッドで解決する

1つレコードを追加するだけなら以下のような感じになります(Mapleから使う場合にはActiveGatewayの生成とdsn/configの設定はDIContainerにさせるので、使うときはいきなりbuildメソッドからいけるはず)。

require_once 'ActiveGateway.class.php';

$dsn = "pgsql://id:passwd@dbserver/dbname";                                 
$config = "tables.ini";

$gw =& new ActiveGateway();
$gw->setDSN($dsn);
$gw->setConfigfile($config);

$member = $gw->build('member');
$member->name = 'foo';
$member->email = 'foo@exmaple.co.jp';
$result = $gw->save($member);
// 上記4行を以下の1メソッドで実行可能
// $member = $gw->create('member', array('name' => 'foo', 'email' => 'foo@example.co.jp'));

レコードの更新はこんな感じ

$member = $gw->find_first('member', array('conditions' => "name like 'f%'", 'order' => 'name'));
$member->name = 'bar';
$member->email = 'bar@example.co.jp';
$result = $gw->save($member);
// 上記3行は以下の1メソッドで実行可能
// $result = $gw->update_attributes($member, array('name' => 'bar', 'email' => 'bar@example.co.jp'));

レコードの削除はこんな感じ

$member = $gw->find_by('member', 'name', 'foo');
$result = $gw->destroy($member);
// 上記2行は以下の1メソッドで実行可能
// $result = $gw->delete_all('member', "name = 'foo'");

今回の公開はこんな感じのものつくったんですがつかいます?というような問いかけだったりします。ここがこういう風になるといいなーとか意見があればがんがん取り込みたいと思いますので、もしご意見があればコメントよろしくお願いします。

なお、現在のものはあくまでもα版で、特に今回のものはDBアクセスが発生してしまいますので、動作を確認される方は完全に隔離されたテスト環境を作成してそこで実行してください。テストは行っておりますが、なにか変なことを起こすということは否定はできませんので。(くれぐれも本番投入とかはまだやめてくださいまし)