Ticket #555 (assigned 新規開発) — at Version 5
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 Client(); $client->name01 = "名前(姓)"; $client->name02 = "名前(名)"; ... snip $pm = getPersistenceManager(); $pm->makePersistent($client);
DB からデータを取得する場合
$pm = getPersistenceManager(); // PK が 1 の dtb_client のデータを取得する $client = $pm->getObjectById(new Client(), 1);
複数のレコードを取得する場合は, キーを配列で渡す. $clients には, dtb_client の連想配列が入る.
LIKE 検索は, 連想配列のキーに suffix をつける. suffix のルールによって, いろいろな検索条件の指定ができそう
$pm = getPersistenceManager(); // email が nanasess を含むものを検索する. %value% のみのサポート $clients = $pm->getObjectsById(new Client(), array("email__like" => "nanasess"));
実装(案)
- 各テーブルのメタデータは, Abstract な Entity クラスで実装する
- 各DBの差異は, ADOdb などの抽象化ドライバで吸収する
- SELECT とか, INSERT とかの処理は, PersistenceManager? クラスが抽象化して行う.
長所
- DB を意識しなくてよい
- ソースコードがものすごくシンプルになる
- 慣れればメンテしやすい
- EC-CUBE 以外でも使用可能
短所
もしかしたら車輪の再発明?良いものが無いので自分で作ります- 慣れるまで大変
SQL をゴリゴリ書けない個別のクエリ, 複雑に JOIN した SQL や VIEW にも対応予定PHP4 で, どこまで実現できるか不明今のところ PHP4 でも問題無し- PersistenceManager? とか, Builder 用のクラスがものすごいことになりそう
あんまり速くない(たぶん)ADOdb の薄いラッパーなので, パフォーマンス悪くないはず
その他検討事項
- エラーハンドリングの方法を要検討
- PEAR::Error を返す
- ADOdb のように false を返して, エラーメッセージを取得する
- trigger_error を使用する
- 独自の方法. PersistenceManager::getErrorHandler() とか.
他の候補
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