我想在我的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层。有没有办法完成我在实体内部要做的事情,或者我是否必须在其外部创建代码?
答案 0 :(得分:5)
我认为你应该在PostRepository
而不是实体模型上实现该方法。
我尝试将所有与模型相关的逻辑保留在“特定于域”方法的存储库中。这样,如果您更改表示帖子是否处于活动状态的方式,您只需更改单个方法的实现,而不必查找应用程序中分散的所有active = true
语句或进行更改一个“无关的”实体模型。
像这样的东西
PostRepository extends EntityRepository {
public function findActiveByUser($user){
// whatever it takes to get the active posts
}
}