模板中的Doctrine2子查询 - 相当于symfony1 lazy query getter

时间:2012-04-27 14:08:31

标签: symfony doctrine doctrine-orm twig

我有两张桌子:

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 个答案:

答案 0 :(得分:2)

您需要在CommentComment\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;
    }
}

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

答案 1 :(得分:0)

  1. 您可以编写自己的hasUserLiked()函数,以便在调用时查询数据库

  2. 您可以加入评论并喜欢表格,并在同一个电话中获取相似内容。 如果您的学说架构设置正确,则可以使用以下查询:

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