2012-04-27 47 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