2011-08-04 5 views
5

Doctrine 2のエンティティに、私が頻繁に実行しなければならないコードを含めるために、いくつかの追加機能を追加したいと思います。たとえば:Doctrine 2エンティティメソッドに便利なクエリを含めることはできますか?

ユーザー - 多くの投稿
ポストを持っている - シングルユーザー私はすでに機能$user->getPosts()を持って

を持っているが、これは私の記事のすべてを返します。

$user->getPosts()->where('active = true') //if this were possible
か::私はのようになる$user->getActivePosts()、書くために探しています私の知る限り
$em->getRepository('Posts')->findBy(array('user'=>$user,'active'=>true)) //if this were more convenient

を、エンティティけれどもエンティティマネージャに戻って取得する方法はありません自身、ので、私の唯一のオプションは

class User { 
    function getActivePosts() { 
    $all_posts = $this->getPosts(); 
    $active_posts = new ArrayCollection(); 
    foreach ($all_posts as $post) { 
     if ($post->getActive()) { 
      $active_posts->add($post); 
     } 
    } 
    return $active_posts; 
} 

だろうしかし、私は実際にはそれらの小さなサブセットをしたいとき、これは、私のエンティティマネージャにすべてのポストをロードするために私を必要とし、それがPHPでフィルタリングを行うために私を必要としそれがm SQLレイヤーでこれを行うのが適切です。エンティティの中で何をしようとしているのかを達成する方法はありますか?あるいは、それ以外のコードを作成する必要がありますか?

答えて

5

エンティティモデルではなくPostRepositoryにメソッドを実装する必要があると思います。

私はすべてのモデル関連のロジックをリポジトリの "ドメイン固有の"方法の背後に置こうとします。そうすれば、投稿がアクティブであるかどうかを表す方法を変更した場合、アプリケーション内に散らばっているactive = true文をすべて見つける必要はなく、「無関係」の文で変更するだけで、エンティティモデル。この

PostRepository extends EntityRepository { 
    public function findActiveByUser($user){ 
    // whatever it takes to get the active posts 
    } 
} 
+1

正しいよう

何か。エンティティマネージャーをエンティティの内部に配置する傾向があるときはいつでも、一歩前進して何らかのサービスやリポジトリで何をしているのかを考えるときがあることは分かっています。 OPの場合、Postsコレクションをフィルタリングしたいだけなら、$ this-> postsをループして配列を取り込むことでEntityでそれを行うことができます - きれいできれいですが、ローディング/ハイドレーティングが必要なので非常に効率的ではありませんすべてのユーザーの投稿 – timdev

+0

Postエンティティが独自のfindActivePosts()メソッド内でPostRepository :: findActiveByUser()を呼び出すことは悪い習慣と考えられますか? –

関連する問題