You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony 4中SQL查询困境:如何获取获赞最多的3位用户?

解决获赞最多3位用户的查询问题

嘿,我来帮你搞定这个获赞最多用户的查询问题~先提几个小细节要注意,再给你两种实用的查询方案:

先修正实体关联的小问题

你的Post实体里$user关联的是App\Entity\User,但实际用户实体是StackUser,得把这个关联改成App\Entity\StackUser,不然ORM映射会报错哦。另外,PostLike里的$Post用了ManyToMany关联,但从业务逻辑来说,一条点赞/点踩应该只对应一篇Post,改成ManyToOne会更合理,还能通过唯一约束避免同一个用户给同一篇Post重复点赞的问题。

另外,StackUser实体需要补充和Post的一对多关联,不然后续查询没法关联用户的帖子:

// 在StackUser类里添加
/**
 * @ORM\OneToMany(targetEntity="App\Entity\Post", mappedBy="user")
 */
private $posts;

public function __construct()
{
    $this->posts = new ArrayCollection();
}

/**
 * @return Collection|Post[]
 */
public function getPosts(): Collection
{
    return $this->posts;
}

方案一:用Doctrine QueryBuilder(推荐,贴合Symfony ORM)

在StackUserRepository里写一个自定义方法,直接查询获赞最多的前3位用户:

// src/Repository/StackUserRepository.php
namespace App\Repository;

use App\Entity\StackUser;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

class StackUserRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, StackUser::class);
    }

    public function findTop3MostLikedUsers()
    {
        return $this->createQueryBuilder('u')
            ->select('u, COUNT(pl.id) as totalLikes')
            ->join('u.posts', 'p') // 关联用户的所有帖子
            ->join('p.postLikes', 'pl') // 关联帖子的所有点赞记录
            ->where('pl.LikeDislike = :isLike')
            ->setParameter('isLike', true) // 只统计赞(LikeDislike=1)
            ->groupBy('u.id')
            ->orderBy('totalLikes', 'DESC')
            ->setMaxResults(3) // 取前3名
            ->getQuery()
            ->getResult();
    }
}

使用的时候直接在控制器里注入StackUserRepository调用这个方法就行,返回的结果是包含用户实体和总赞数的数组。

方案二:用原生SQL查询

如果你更习惯写原生SQL,也可以这样(注意调整表名和中间表,因为ManyToMany会生成中间表):

// 在控制器或Repository中执行
$em = $this->getDoctrine()->getManager();
$sql = <<<SQL
SELECT su.id, su.username, COUNT(pl.id) as total_likes
FROM stack_user su
JOIN post p ON su.id = p.user_id
JOIN post_like_post plp ON p.id = plp.post_id -- ManyToMany的中间表,默认命名是两个实体名拼接
JOIN post_like pl ON plp.post_like_id = pl.id
WHERE pl.like_dislike = 1
GROUP BY su.id, su.username
ORDER BY total_likes DESC
LIMIT 3
SQL;

$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAllAssociative();

这个方法返回的是关联数组,包含用户ID、用户名和总赞数。

思路说明

核心逻辑就是:先关联用户到他发布的所有帖子,再关联帖子的所有点赞记录,筛选出“赞”的记录,按用户分组统计点赞总数,最后按总数倒序取前3名。

内容的提问来源于stack exchange,提问作者Kovenk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:44:08