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

Doctrine 我可以在条令2实体方法中包含一个方便的查询吗?,doctrine,doctrine-orm,Doctrine,Doctrine Orm,我想在我的Doctrine 2实体中包含一些额外的函数,以包含我必须经常运行的代码。例如: 用户-有许多帖子 Post-只有一个用户 我已经有了一个函数$user->getPosts(),但它会返回我所有的帖子。我想写一个$user->getActivePosts(),如下所示: $user->getPosts()->where('active=true')//如果可能的话 或: $em->getRepository('Posts')->findBy(array('user'=>$user,'a

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

用户-有许多帖子
Post-只有一个用户

我已经有了一个函数
$user->getPosts()
,但它会返回我所有的帖子。我想写一个
$user->getActivePosts()
,如下所示:

$user->getPosts()->where('active=true')//如果可能的话

或:
$em->getRepository('Posts')->findBy(array('user'=>$user,'active'=>true))//如果这更方便的话

据我所知,无法通过实体本身返回实体管理器,因此我唯一的选择是

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层中这样做更合适。有没有办法在实体内部完成我想要做的事情,或者我必须在实体外部创建代码?

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

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

像这样的

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

对的任何时候,当您想在实体中放置entitymanager时,您都知道是时候退一步,考虑在某种服务或存储库中执行任何操作。在OP的例子中,如果他只是想过滤Posts集合,他可以在实体中通过循环$this->Posts并填充一个数组来实现这一点——既漂亮又干净,但效率不是很高,因为它需要加载/水合所有用户的Posts。Post实体调用PostRepository::findActiveByUser()是否被认为是一种不好的做法在它自己的findActivePosts()方法中?