1

2 つの Doctrine エンティティがあるとします。

ユーザーとメッセージ

すべてのユーザーは「n」個のメッセージを持つことができます。

ここで、ユーザーのメールボックスを表示したいので、ORM からユーザー エンティティを取得し、このエンティティからすべてのメッセージを取得します。今のところ問題ありません。

しかし、今はメッセージのより複雑なフィルタリングが必要です。例: 最大年齢、最大カウント、いくつかの単語のブラックリスト登録など。したがって、メッセージを取得するためのエンティティの既定の getter メソッドでは十分ではありません。

どうすればこれを解決できますか?

エンティティ リポジトリは私が最初に見つけたものですが、ユーザーとメッセージの関係を壊すユーザー オブジェクトの外部からこのリポジトリに問い合わせる必要があります (user->getMessages( ではなく repository->getMessagesForUser(userId,...))。 ...)) 私にとっては「クリーンな」OOP ソリューションとは思えません。

私が考えることができる別の方法は、この手の込んだ ORM をすべて無視して、独自のモデルを作成し、最下層の ORM または DBAL レイヤーでデータベースから情報を取得することです。そして、エンティティをエーテルでラップするか、自分のモデルのフィールドを手動で埋めます。しかし、「なぜDoctrineを使用したのですか?」と自問します。

では、この場合のベストプラクティスは何ですか。ちなみにSymfony2を使っています。

4

1 に答える 1

2

この特定のケースでは、メッセージを独自の集計にすることは間違いないため、そのためのリポジトリを作成し、ユーザーからメッセージへの関係を削除します。ユーザーはとにかく多くのメッセージを持つことができるため、他のアプローチを使用するのは非常に非効率的です。

次に、MessageRepository に特定のメソッドを作成します。

class MessageRepository
{
    public function findByUser(User $user) {
        // ...
    }
    public function findReadMessagesByUser(User $user) {
        // ...
    }
}
于 2012-07-10T21:38:10.937 に答える