2011-06-24 12 views
9

私はPHPでDAOパターンを使っています。この方法でモデルを分離することで得られるメリットを理解していますが、テーブルが関連エンティティと関連しているときにDAOとVOを構築する方法はわかりませんDAOパターンと関係

例を挙げます:

私のDBで、私は

USERS(id,username); 

USERS_POSTS(id_user(FK),id_post(FK)); 

POSTS(id, title); 

USER_COMMENTS(id_user(Fk),id_post(FK)); 

COMMENTS(id, text); 

を持っている私は、対応するセッターとゲッターとPostVOUserVOを作成し、UserDAOポストDAOは、最終的にVOを返すSQLを担当しています。 これらのテーブルのデータに対してCRUD操作を実行するのは本当に簡単ですが、テーブルの関連付けや異なるテーブル間のデータの取得について考え始めると、DAOの使用がそれほど簡単ではないと考え始めるときです。

あなたは記事の作者が行ったコメントをすべて返そうと思ったらDAOパターンを整理しますか?私はSQLクエリを必要としません。私はちょうど実際の状況の例としてこれを与えています...

私は、すべての結合テーブルに関連するDAOとVoを持つことをお勧めします。 VOはどのようなものですか?ちょうど2つの外部キーまたは両方のテーブルのすべての属性からですか?

論理が関連エンティティに対してDAOとVOを持っている場合、クエリが2つの関連エンティティを使用して3つ以上のテーブルを "通過"する場合の解決策は何ですか?

I)はDAOパターンがusers_posts_comments_article :)と呼ばれるオブジェクトを持っているだろうことを疑う)

おかげ

+0

などメンテナンス性に直接行く、私は3 upvotes得なunabstracted過度にコピー/貼り付け機能を定義し、本当に悪い考えです:誰もが私たちにこの問題についての詳細を伝えることができ、今のpを:) I救助にORMがあることを知っているが、私はDAOのポーティングを得ていない))) – luigi7up

+0

そして、私はほとんど忘れてしまった...私が関係を扱うことを始めたら、ホイール - すなわちORM ?! – luigi7up

答えて

1

自身としてあなたはそれを提供する層を取得し、書き込みたいデータの種類。 2つ以上のテーブルを結合するクラスを何に呼び出すかについて考えないでください。 テーブルをモデルにすることを考えていて、プロジェクトに適していない方向に向いている可能性があります。あなたのプロジェクトがどれほど大きいかわからないので、これがOKかどうかはわかりません。ここで

は間違いなく思考のためにあなたにいくつかの食べ物を与える読み取ります: http://weierophinney.net/matthew/archives/202-Model-Infrastructure.html(彼はドメインモデルを参照することです)その記事から

引用:

あなたはこれらの観点から考える、あなた 開始あなたのシステムを に分割して、 を操作する必要があることと、どのようにして が他のものと関連しているかを検討してください。この 運動の種類も あなたのモデルの考えを停止するのに役立ちます データベーステーブルの代わりに、 データベースは のコンテナになります。このデータは、モデルのある用途 から次のデータに永続化されます。お使いのモデル は、 のデータを受信するか、 データを格納するか、完全に というデータを格納することができるオブジェクトです。

+0

ジュリアン、あなたの答えをありがとう、しかしあなたはあなたの答えにもう少し具体的なことができますか?あなたは、 "それを提供する層を書く"と言う。ついにあなたは最終的に何を持っていますか? – luigi7up

+2

あなたは 'class BlogService'のようなものを持っていて、' getCommentsForUser($ userId) '、' getUsersWhoNeverValidatedTheirEmailAddress($ options) 'などなどがあります。これはあなたのブログをより一般的な方法で見ています。あなたのdbテーブルクラスができることに制約されています。 – Julian

+0

余分なサービス層は良いアイデアです。データレイヤーを基本的なものにしておけば、サービスはそれらを組み合わせてより複雑なプロセスを形成することができます。 –

0

シンプルにしてください。 DAOまたは何らかの哲学や何かが特定の制限にのみ意味をなすことができます。

IMHO、単純なgetitem( 'class'、$ conditions)に行くか、関連する($ pathandconditions、$ itemconditions)という抽象化が必要な場合、これはブログのような単純な時間の無駄です。

この種のものは、基本的なSQLの使用に必要なすべてのニーズを確実にカバーしています。

getUsersWhoHaveAFrigginLongMethodNameofDoomグレート