2011-08-04 23 views
5

我想在我的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中要做的事情,還是需要在其外創建代碼?

回答

5

我認爲你應該在PostRepository而不是實體模型上實現該方法。

我嘗試在「特定於領域」的方法後面保留存儲庫中的所有模型相關邏輯。這樣,如果您更改表示帖子是否處於活動狀態的方式,則只需更改單個方法的實現,而不必查找散佈在應用程序中的所有語句,或者更改「不相關的」實體模型。

像這樣的事情

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

正確的。無論何時,如果您傾向於將實體管理器放入實體中,您應該退一步,考慮在某種服務或存儲庫中做任何事情。在OP的情況下,如果他只是想過濾Posts集合,他可以在實體中做到這一點,只需循環$ this-> posts並填充一個數組 - 很好,乾淨,但效率不高,因爲它需要加載/保溼所有用戶的帖子。 – timdev

+0

Post實體在它自己的findActivePosts()方法中調用PostRepository :: findActiveByUser()是否被認爲是不好的做法? –

相關問題