Ticket #555 (new 新規開発) — at Initial Version

Opened 16 years ago

Last modified 14 years ago

EC-CUBE で O/R Mapper 的なものを実装する

Reported by: nanasess Owned by: nanasess
Priority: Milestone: バックログ
Component: その他 Version: 2.4.1
Keywords: Cc:
修正済み: no

Description

概要

Java の JDO(Java Data Objects - JSR243) のような O/R Mapper を EC-CUBE で実現する.

サンプルコード(案)

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 用のクラスがものすごいことになりそう
  • あんまり速くない(たぶん)
Note: See TracTickets for help on using tickets.