id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	modified_flg
555	EC-CUBE で O/R Mapper 的なものを実装する	nanasess	nanasess	"=== 概要 ===

Java の JDO(Java Data Objects - JSR243) のような O/R Mapper を EC-CUBE で実現する.

=== 導入要件 ===
 - TABLE VIEW に対して Model を作成可能なこと
 - 複雑な JOIN に対応可能なこと
   - 複雑な JOIN をしても, 返り値は Model にしたい

=== サンプルコード(案) ===

DB に INSERT するのはこんな感じ.

{{{
$client = new dtb_client();
$client->name01 = ""名前(姓)"";
$client->name02 = ""名前(名)"";

... snip

$pm = new PersistenceManager();
$pm->makePersistent($client);
}}}

DB からデータを取得する場合

{{{
$pm = new PersistenceManager();
// PK が 1 の dtb_client のデータを取得する
$client = $pm->getObjectById(""dtb_client"", 1);
}}}

複数のレコードを取得する場合は, キーを配列で渡す.
$clients には, dtb_client の連想配列が入る.
同じキーが複数存在した場合は, IN 句の SQL になる.

{{{
$pm = new PersistenceManager();
// PK が 1 と 2 の dtb_client のデータを取得する
$clients = $pm->getObjectsById(""dtb_client"", array(""client_id"" => 1,
                                                   ""client_id"" => 2));
}}}

LIKE 検索は, 連想配列のキーに suffix をつける.
suffix のルールによって, いろいろな検索条件の指定ができそう

{{{
$pm = new PersistenceManager();
// email が nanasess を含むものを検索する. %value% のみのサポート
$clients = $pm->getObjectsById(""dtb_client"", array(""email__like"" => ""nanasess""));
}}}

=== 実装(案) ===

 - 各テーブルのメタデータは,  Builder パターンを利用して, PersistenceManager に関連するメタデータ用のクラスで実装する
 - 各DBの差異も, 上記のメタデータ用クラスで吸収する. 
 - SELECT とか, INSERT とかの処理は, PersistenceManager クラスが抽象化して行う. PEAR::DB とか, PDO に対するドライバを提供して, 差異を吸収する

=== 長所 ===

 - DB を意識しなくてよい
 - ソースコードがものすごくシンプルになる
 - 慣れればメンテしやすい
 - たぶん, EC-CUBE 以外でも使用可能

=== 短所 ===

 - もしかしたら車輪の再発明？
 - 慣れるまで大変
 - SQL をゴリゴリ書けない
 - PHP4 で, どこまで実現できるか不明
 - PersistenceManager とか, Builder 用のクラスがものすごいことになりそう
 - あんまり速くない(たぶん)

=== 他の候補 ===
 - http://rhaco-users.jp/
 - http://phplens.com/lens/adodb/docs-active-record.htm"	新規開発	new	中	EC-CUBE2.x.x	その他	2.4.1				
