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层中这样做更合适.有没有办法完成我在实体内部要做的事情,或者我是否必须在其外部创建代码?
我认为你应该PostRepository在实体模型而不是实体模型上实现该方法.
我尝试将所有与模型相关的逻辑保留在"特定于域"方法的存储库中.这样,如果您更改表示帖子是否处于活动状态的方式,则只需更改单个方法的实现,而不必查找active = true应用程序中分散的所有语句或在"不相关"实体中进行更改模型.
像这样的东西
PostRepository extends EntityRepository {
public function findActiveByUser($user){
// whatever it takes to get the active posts
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |