2012-04-27 16 views
4

相當於我有兩個表:Doctrine2子查詢模板 - symfony1懶查詢吸氣

comment - id, application_id, comment, user_id, created_at, deleted_at 

comment_likes - comment_id, user_id 

我可以使用標準的DQL檢索應用程序的意見SELECT u FROM Comment WHERE :application = application

當通過意見截枝,我想要查看登錄的用戶是否已經收到了評論。

在symfony1,我會用一個簡單的懶惰查詢$comment->hasUserLiked()

目前,在Symfony2中,我做的所有用戶的查詢喜歡的應用程序的意見和全部申請意見查詢。

當在應用程序註釋中循環時,我會在每個註釋中執行一個子循環以檢查用戶是否喜歡記錄是否存在於用戶喜歡的註釋集合中。這不乾淨。

希望這是有道理的。

有沒有更好的方法?

編輯:我可以使用一個子控制器來呈現用戶是否喜歡評論或沒有....但這似乎是頂部只是幾行html。雖然,比當前的實施更清潔。

回答

2

您需要建立CommentComment\Like實體之間的雙向one-to-many關係。這樣,一個Comment實體就會知道它擁有的所有喜好。然後你可以實現一個像$comment->hasBeenLikedBy($user)這樣的方法,它可以遍歷所有喜歡的東西,看看它們中的任何一個是否由你通過的用戶完成。

Comment實體:

<?php 
namespace Model; 

class Comment 
{ 
    /** 
    * @OneToMany(targetEntity="Model\Comment\Like", mappedBy="comment") 
    */ 
    private $likes; 

    public function hasBeenLikedBy(User $user) 
    { 
     foreach ($this->likes as $like) { 
      if ($like->getUser() == $user) { 
       return true; 
      } 

      return false; 
     } 
    } 
} 

Comment\Like實體:

<?php 
namespace Model\Comment; 

class Like 
{ 
    /** 
    * @ManyToOne(targetEntity="Model\Comment") 
    */ 
    private $comment; 

    /** 
    * @ManyToOne(targetEntity="Model\User") 
    */ 
    private $user 

    public function getUser() 
    { 
     return $this->user; 
    } 
} 

此代碼是不完整的,可能有錯誤,但我希望它足以向您展示的總體思路。

+0

謝謝你的回答。我相信這是最乾淨的方式。賞金已被獎勵:) – Flukey 2012-05-07 05:47:01

0
  1. 您可以編寫自己的hasUserLiked()函數來查詢數據庫稱爲

  2. 你可以加入我們的意見和喜歡的桌子,買喜歡在同一個呼叫時。 您可以使用下面的查詢,如果您的教義模式是否設置正確:

    SELECT c FROM Comment c LEFT JOIN c.CommentLikes cl WHERE c.application = :application

+0

您好,非常感謝您的回覆。 1.您不能直接將數據庫調用放入實體中。唉。 2.如果我想知道登錄的用戶是否喜歡評論,那不會幫助我。 – Flukey 2012-04-30 11:35:32