Ticket #555 (assigned 新規開発) — at Version 5

Opened 11 years ago

Last modified 9 years ago

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

comment:2 Changed 11 years ago by nanasess

  • Description modified (diff)

comment:3 Changed 11 years ago by nanasess

  • Status changed from new to assigned
  • Description modified (diff)

手元の環境で, ある程度の実装ができてきたので, 説明を更新.

comment:4 Changed 11 years ago by nanasess

  • Milestone changed from EC-CUBE2.x.x to EC-CUBE2.5.0

comment:5 Changed 11 years ago by nanasess

  • Description modified (diff)

エラーハンドリングの案を追記

Changed 11 years ago by nanasess

PHPDoc を添付

Changed 11 years ago by nanasess

参考実装のプログラムを添付

Changed 11 years ago by nanasess

テストケースを添付

Note: See TracTickets for help on using tickets.