我可以在Doctrine 2实体方法中包含一个便利查询吗?

时间:2011-08-04 18:36:27

标签: doctrine doctrine-orm

我想在我的Doctrine 2实体中包含一些额外的函数来包含我必须经常运行的代码。例如:

用户 - 有很多帖子
发布 - 有一个用户

我已经有一个函数$user->getPosts(),但这会返回我的所有帖子。我想写一个$user->getActivePosts(),就像:

$user->getPosts()->where('active = true') //if this were possible
或:
$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中进行过滤,而在这样做时更合适。 SQL层。有没有办法完成我在实体内部要做的事情,或者我是否必须在其外部创建代码?

1 个答案:

答案 0 :(得分:5)

我认为你应该在PostRepository而不是实体模型上实现该方法。

我尝试将所有与模型相关的逻辑保留在“特定于域”方法的存储库中。这样,如果您更改表示帖子是否处于活动状态的方式,您只需更改单个方法的实现,而不必查找应用程序中分散的所有active = true语句或进行更改一个“无关的”实体模型。

像这样的东西

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