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

And*_*ert 5 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,这需要我将所有帖子加载到我的实体管理器中,当我真的只需要它们的一小部分时,它需要我在PHP中进行过滤,而在SQL层中这样做更合适.有没有办法完成我在实体内部要做的事情,或者我是否必须在其外部创建代码?

Jon*_*ist 5

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

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

像这样的东西

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