2011-07-11 14 views
2

私はZend Frameworkを使って自分のスキルを磨き上げ、少し壁に当たったCMSプロジェクトに取り組んできました。私はビジネスモデルと基礎となるストレージの間の論理の良い分離のためにデータベースのやりとりを扱う際にデータマッパーパターン(http://martinfowler.com/eaaCatalog/dataMapper.html)を採用することを早期に決定しました。データマッパーパターン - ID以外のフィールドでオブジェクトを選択するにはどうすればいいですか?

ドメインオブジェクトのプロパティが必ずしも基底のデータベース列と同じ名前である必要はない(例:主キーと外部キーの名前付けスキームがあり、自動挿入と遅延ロードに役立ちます) 。

私はsurvivethedeepend.comに基づいて&のチュートリアルを採用しましたが、私が見たすべてのサンプル/サンプル/チュートリアルの実装では、オブジェクトがIDで取得されていないときに検索を処理する方法を完全に無視しています。私は複数の言語のチュートリアルを試して、手がかりを得ようとしてきましたが、それらはすべて挿入、IDによる更新、IDによる削除を処理するように見えます。& IDで選択!

私はいくつかの質問があります。その最初のものは、非主キーフィールドでの取得についてどう思いますか?必要な検索ごとに特定のメソッド、すなわち '$ entity-> findByName(' Bob ');'を作成する通常の方法です。それは長期的には非常に硬く扱いにくいようです。

そして、データベースの名前が異なるオブジェクトのプロパティを取得する方法はありますか?私は3つの引数(オブジェクトプロパティ名、where句に埋め込むための修飾子、例えば '='または '>'と一致する値)を取るジェネリックなselectメソッドを考えることを考えてきました。しかし、私はこれがデータマッパーパターンのかなり堅い構造という考えにはないと思います。

どのように進行するのが最善だろうとアドバイスできますか?誰でもこれを見つけましたか?&もしそうなら、どうやってそれをやったのですか?

私はDoctrineのようなプロジェクトがこれを処理するために存在することを認識していますが、現時点ではむしろ「社内」のソリューションを開発したいと思います。

答えて

4

findByXXX()メソッドを持つことは、プロパティのモデルにgettersとsetterを持たせるよりも厳密ではありません。

データベースに異なる名前を持つプロパティについては、データベースの列の後ではなくオブジェクトのプロパティの後にfindByメソッドの名前を付けます。結局のところ、オブジェクトのプロパティがnameで、getName()setName()のメソッドがある場合、実際のデータベース列が別のものと呼ばれているにもかかわらず、セレクタメソッドがgetByName()と呼ばれることは論理的です。

+0

サンダーさん、ありがとうございました。だから、汎用的な 'select($ property、$ modifier、$ value)'関数の代わりに、多くの特殊なメソッドを持つことは受け入れられると考えられます。 – Beeblebrox

+1

私は@ SanderMarechalに同意します。また、このSOの質問を参照してください:[サービスクラスの柔軟なベース 'find'メソッドを作成するヘルプ...](http://stackoverflow.com/questions/6629432/help-creating-a-flexible-base-find-method -in-a-service-class-the-dry-prin)を使用しています。 Doctrineについて語っていますが、一般的なアクセス方法と特定のアクセス方法の必要性をバランスさせるための一般的な質問に関連しています。 @ Janiの助言は@ SanderMarechalに似ています。 –

+0

Davidさん、ありがとうございました。前方の道がはっきりしているようです。 – Beeblebrox

関連する問題