Ticket #555 (new 新規開発) — at Version 2
EC-CUBE で O/R Mapper 的なものを実装する
| Reported by: | nanasess | Owned by: | nanasess |
|---|---|---|---|
| Priority: | 低 | Milestone: | バックログ |
| Component: | その他 | Version: | 2.4.1 |
| Keywords: | Cc: | ||
| 修正済み: | no |
Description (last modified by nanasess) (diff)
概要
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 用のクラスがものすごいことになりそう
- あんまり速くない(たぶん)
他の候補
Change History
Note: See
TracTickets for help on using
tickets.

開発コミュニティでの関連スレッド
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&order=ASC&topic_id=4868&forum=3