バージョン選択

フォーラム

メニュー

オンライン状況

48 人のユーザが現在オンラインです。 (32 人のユーザが フォーラム を参照しています。)
登録ユーザ: 3
ゲスト: 45
akadota chako79 woz もっと...

サイト内検索

機能要望 > その他 > EC-CUBE で O/R Mapper 的なもの

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
nanasess
投稿日時: 2009/10/27 11:05
対応状況: −−−
登録日: 2006/9/9
居住地: 大阪
投稿: 2089
EC-CUBE で O/R Mapper 的なもの
大河内です.

通勤途中に閃いたので書いてみました.

EC-CUBE で Java の JDO のような O/R マッパーが実現できないか... というアイディアです.
あくまでも案なので, 本当に実現できるかどうか未定ですが, いかがでしょうか?

最近のトレンドな PHP のフレームワークをよく知らないので, もっと良いのがあるよとか, 教えていただけたらと思います.

PHP4, 5 対応で, ここまでやってるのは見たことないので, 無いものは作ってしまえ的な発想です.

あわよくば, EC-CUBE2.5 で実現できたらなぁと思います.
みなさまのご意見をお聞かせください.
良さげな感じでしたら, チャレンジしてみたいと思います.

■ 概要

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 用のクラスがものすごいことになりそう
- あんまり速くない(たぶん)
pineray
投稿日時: 2009/10/27 11:42
対応状況: −−−
長老
登録日: 2006/9/9
居住地: 伊賀
投稿: 288
Re: EC-CUBE で O/R Mapper 的なもの
とても良いアイデアだと思います。

不勉強なので JDO を良く分かっていないのですが、
MVCにおける Model にあたるものですよね。

現在、データベースにかかわる処理がいたるところに分散し、
またそれぞれでベタにSQLが記述されているという状況であり、
なんとかしなくちゃな、と思っていたところでした。

引用:
- PersistenceManager とか, Builder 用のクラスがものすごいことになりそう

上記に関しては、すべてをひとつのクラスですませようとせず、
基本となるクラスを継承する形で、商品一覧用や商品詳細用といった
目的別のクラスを作成するようにしてはいかがでしょうか?


----------------
EC-CUBEカスタマイズ
Drupalサイト構築
あったらうれしい、が見つかる veranda

nanasess
投稿日時: 2009/10/27 12:24
対応状況: −−−
登録日: 2006/9/9
居住地: 大阪
投稿: 2089
Re: EC-CUBE で O/R Mapper 的なもの
引用:

pinerayさんは書きました:
とても良いアイデアだと思います。

不勉強なので JDO を良く分かっていないのですが、
MVCにおける Model にあたるものですよね。


ありがとうございます!
正確には, Model の永続化を実現するための Dao(Data Access Objects) にあたります.

引用:

引用:
- PersistenceManager とか, Builder 用のクラスがものすごいことになりそう

上記に関しては、すべてをひとつのクラスですませようとせず、
基本となるクラスを継承する形で、商品一覧用や商品詳細用といった
目的別のクラスを作成するようにしてはいかがでしょうか?


基本的に, PersistenceManager は抽象化した処理をするのみで, 各テーブルのカラム情報や, DB ごとの差異は, Model クラスや, PersistenceManager の内部処理をする別クラスに持たせてしまおうと思っています.

商品一覧なら, ProductLists モデル, 詳細なら Product モデルの内部にカラムの情報などをを格納してやって,


// 商品詳細のインスタンスを生成
$product = new Product();

$pm = new PersistenceManager();
// product_id = 1 のデータを取得
$product = $pm->getObjectById($product, 1);


とやると, product_id = 1 の商品詳細が $product に格納されるイメージです.

下記のようにできた方がわかりやすくて良いかも.


$product = new Product();
$product->product_id = 1;
$product = $pm->getObjectById($product);


ちょっと野心的すぎな気もしますが, 実現できたら, EC-CUBE 以外にもいろいろ広がりそうです.
seasoft
投稿日時: 2009/10/27 12:35
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7332
Re: EC-CUBE で O/R Mapper 的なもの
Windows の ADO や RDO あたりに相当するものでしょうか?

だとしたら、嬉しいですね。特に INSERT / UPDATE は勝手が気に入っています。

PHP を使い始めた当初は、Windows の ADO っぽい (ただし非常にチープな) ライブラリを自作して使っていました。


> - あんまり速くない(たぶん)

ここ、心配ですね。RAW な SQL を扱える既存のロジックと共存するなり出来れば、良いのかな。

ただ、それを容認すると、ロジックの書き方が分散してしまって、新たに EC-CUBE を使い始める方が覚えることが増えて大変かなぁという懸念もあるかも。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

nanasess
投稿日時: 2009/10/27 13:03
対応状況: −−−
登録日: 2006/9/9
居住地: 大阪
投稿: 2089
Re: EC-CUBE で O/R Mapper 的なもの
引用:

seasoftさんは書きました:
Windows の ADO や RDO あたりに相当するものでしょうか?


Windows の ADO や RDO をあまり知らないので恐縮なのですが, たぶんもっとオブジェクトの永続化を意識したものになると思います.

引用:

> - あんまり速くない(たぶん)

ここ、心配ですね。RAW な SQL を扱える既存のロジックと共存するなり出来れば、良いのかな。

ただ、それを容認すると、ロジックの書き方が分散してしまって、新たに EC-CUBE を使い始める方が覚えることが増えて大変かなぁという懸念もあるかも。


PHP がやる仕事は, あまり多くないはずなので, それほど気にしなくて良いかなぁ... とも思います.
PDO とか, PEAR::MDB2 なんかを, PersistenceManager でラップするようなイメージなので, PDO とか MDB2 のボトルネックの方が大きいかも.
まだ, 1行もコードを書いてないので想像ですけど^^;
nanasess
投稿日時: 2009/10/27 18:27
対応状況: −−−
登録日: 2006/9/9
居住地: 大阪
投稿: 2089
Re: EC-CUBE で O/R Mapper 的なもの
チケット発行してみました

http://svn.ec-cube.net/open_trac/ticket/555
nanasess
投稿日時: 2009/10/28 0:34
対応状況: −−−
登録日: 2006/9/9
居住地: 大阪
投稿: 2089
Re: EC-CUBE で O/R Mapper 的なもの
引用:

ここ、心配ですね。RAW な SQL を扱える既存のロジックと共存するなり出来れば、良いのかな。

ただ、それを容認すると、ロジックの書き方が分散してしまって、新たに EC-CUBE を使い始める方が覚えることが増えて大変かなぁという懸念もあるかも。

パフォーマンスの問題からは離れてしまうのですが...

いろいろ考えてみたんですけど, カスタマイズでカラムを増やした時などは SQL を直書きできた方が一般の開発ユーザーに優しそうですね.


$pm = new PersistenceManager();

// SELECT の結果を連想配列で取得する
$client = $pm->getArrayBySql(array(), "SELECT * FROM dtb_client");

// SELECT の結果を Model で取得する
$client = $pm->getObjectBySql(new Client(), "SELECT * FROM dtb_client");


デフォルトでは, 完全に SQL を隠蔽してしまって問題ないと思うんですけど, PHP 初心者のことを考えると, 上記のように SQL を直書きできるようにしておいて, カスタマイズ時は置きかえてもらった方が, 直感的で扱いやすいのではないか? と思いました.
seasoft
投稿日時: 2009/10/28 11:19
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7332
Re: EC-CUBE で O/R Mapper 的なもの
PersistenceManager::get***BySql 良い感じですね。

ちなみに、最終的に SC_Query あたりは、使わなくなる方向でしょうか?


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

ghana
投稿日時: 2009/10/28 11:26
対応状況: −−−
新米
登録日: 2009/10/28
居住地:
投稿: 8
Re: EC-CUBE で O/R Mapper 的なもの
ADOdb Active Record
http://phplens.com/lens/adodb/docs-active-record.htm
とかどうでしょう?
PHP4 と PHP5 両方対応しているようですが
kishik
投稿日時: 2009/10/28 11:31
対応状況: −−−
仙人
登録日: 2009/4/3
居住地: 東京
投稿: 382
Re: EC-CUBE で O/R Mapper 的なもの
横からですが。。

私個人的な意見としては、
初心者ならなおさらSQL直書きは敬遠されるかと。。

世の中のオブジェクト指向化がここまで進む中で、
EC-CUBEもその波に乗らないことには
この先のユーザーを獲得するのは難しいと感じています。

上級者がSQL直書きをする糊しろがある設計だといいなあ
と思います。
(1) 2 3 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は64,558名です
総投稿数は97,284件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
468
2494
4
nanasess
2089
5
umebius
1651
6
yuh
1612
7
red
1411
8
h_tanaka
1029
9
fukap
907
10
tsuji
863
11
shutta
835
12
tao_s
792
13 ramrun 789
14 karin 657
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.