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
相关产品推荐
相关产品推荐

