我想在我的Doctrine 2實體中包含一些額外的功能來包含我將不得不頻繁運行的代碼。例如:我可以在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層更適合這樣做。有什麼方法可以完成我在Entity中要做的事情,還是需要在其外創建代碼?
正確的。無論何時,如果您傾向於將實體管理器放入實體中,您應該退一步,考慮在某種服務或存儲庫中做任何事情。在OP的情況下,如果他只是想過濾Posts集合,他可以在實體中做到這一點,只需循環$ this-> posts並填充一個數組 - 很好,乾淨,但效率不高,因爲它需要加載/保溼所有用戶的帖子。 – timdev
Post實體在它自己的findActivePosts()方法中調用PostRepository :: findActiveByUser()是否被認爲是不好的做法? –