Ticket #555 (assigned 新規開発)

Opened 11 years ago

Last modified 8 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 するのはこんな感じ. プライマリーキーが一致するデータが存在する場合は UPDATE になります.

$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);

複数のレコードを取得する場合. limit, offset は, 引数で指定

$pm = getPersistenceManager();
//  dtb_client の column1 が expression に一致するデータを取得する
$client = $pm->getObjectsById(new Client(), array("column1" => "expression"));

$clients には, dtb_client の連想配列が入る.

LIKE 検索は, 連想配列のキーに suffix をつける. suffix のルールによって, いろいろな検索条件の指定ができそう

$pm = getPersistenceManager();
// email が nanasess を含むものを検索する. %value% のみのサポート
$clients = $pm->getObjectsById(new Client(), array("email__like" => "nanasess"));

データを削除する場合

$pm = getPersistenceManager();
// $client のプライマリーキーに一致するデータを削除する
$pm->deletePersistent($client);

SQL直書きにも対応

$pm = getPersistenceManager();
$client = $pm->getObjectsBySql(new Client(), "SELECT * FROM dtb_client WHERE client_id = ?", array(1));

更新系のクエリは, executeBySql() を使用

$pm = getPersistenceManager();
$pm->executeBySql("UPDATE dtb_client SET name = ? WHERE client_id = ?", array('hogehoge', 1));

トランザクションは, Transaction クラスを使用

$pm = getPersistenceManager();
$tx = $pm->currentTransaction();
$tx->begin();

... snip

$tx->commit();

シーケンスは, Sequence クラスを使用

$pm = getPersistenceManager();
$sequence = $pm->getSequence('dtb_client_client_id_seq');
$client->client_id = $sequence->nextValue();
$pm->makePersistent($client);

実装(案)

  • 各テーブルのメタデータは, 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() とか.
  • limit, offset とか, order by の実装方法
    • エンティティにセットするのが良い?

他の候補

Attachments

XDO_phpdoc.zip Download (84.1 KB) - added by nanasess 11 years ago.
PHPDoc を添付
XDO.zip Download (11.1 KB) - added by nanasess 11 years ago.
参考実装のプログラムを添付
XDO_testcase.zip Download (5.1 KB) - added by nanasess 11 years ago.
テストケースを添付

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

テストケースを添付

comment:6 Changed 11 years ago by nanasess

  • Description modified (diff)

comment:7 Changed 11 years ago by nanasess

  • Description modified (diff)

comment:8 Changed 10 years ago by nanasess

  • Priority changed from to

comment:9 Changed 10 years ago by nanasess

  • Milestone changed from EC-CUBE2.5.0beta to EC-CUBE2.6.0(仮)

comment:10 Changed 8 years ago by h_yoshimoto

  • 修正済み unset
  • Milestone changed from EC-CUBE2.12.0alpha to バックログ

ひとまずバックログへ移動させていただきます。

Note: See TracTickets for help on using tickets.