4

我有两张桌子:

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 的顶部。虽然,比当前的实现更干净。

4

2 回答 2

2

Comment您需要在和Comment\Like实体之间建立双向的一对多关系。这样,一个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;
    }
}

此代码不完整,可能包含错误,但我希望它足以向您展示整体方法。

于 2012-05-04T16:58:36.893 回答
0
  1. 您可以编写自己的 hasUserLiked() 函数来在调用时查询数据库

  2. 您可以加入评论和点赞表,并在同一个电话中获得点赞。如果您的学说架构设置正确,您可以使用以下查询:

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

于 2012-04-29T21:15:24.497 回答