我正在为自己的社交网络苦苦挣扎,我正试图根据他们喜欢的数量对帖子的评论进行排序。 所以我制作了三张桌子:一篇有很多评论的帖子和一篇评论很多赞。当然,有一个User表可以处理所有这些。
public function loadProfilePost($user, $first = 0, $limit = 0)
{
$q = $this->_em->createQueryBuilder()
->select('post, comment')
->from('EvoSocialBundle:Post', 'post')
->leftJoin('post.comments', 'comment')
->where('post.user = :user')
->setParameter(':user', $user)
->addOrderBy('post.created', 'DESC');
$q->setFirstResult($first);
if($limit > 0)
$q->setMaxResults($limit);
return $q->getQuery()->getResult();
}
答案 0 :(得分:1)
要根据喜欢的数量对评论进行排序,您可以在查询构建器中添加一个与喜欢实体相关联的联接,然后按group by post.id,comments.id
之类的条件设置分组,我添加了addSelect()
计数功能来计算喜欢评论并设置count AS HIDDEN
的结果,以便它们不会与结果集一起返回,并且只会影响查询构建器部分
public function loadProfilePost($user, $first = 0, $limit = 0)
{
$q = $this->_em->createQueryBuilder()
->select('p, c')
->addSelect('COUNT(DISTINCT c.id) AS HIDDEN total_likes')
->from('EvoSocialBundle:Post', 'p')
->leftJoin('p.comments', 'c')
->leftJoin('c.likes', 'l')
->where('p.user = :user')
->setParameter(':user', $user)
->groupBy('p.id')
->addGroupBy('c.id')
->orderBy('total_likes','DESC');
$q->setFirstResult($first);
if($limit > 0)
$q->setMaxResults($limit);
return $q->getQuery()->getResult();
}