Symfony如何获取指定用户最近9条收藏内容
实现步骤
1. 修正FavoriteRepository的查询能力
现有lastXFavorite方法的设计是校验「指定用户是否收藏某条特定内容」,入参强制要求传入Publication实体,和当前“查询指定用户最近9条收藏”的需求完全不匹配,直接复用会产生逻辑冲突。需要在FavoriteRepository中新增适配场景的查询方法:
// 位于 App\Repository\FavoriteRepository 类内部 public function getLatestUserFavorites(User $user, int $limit = 9) { return $this->createQueryBuilder('f') // 关联预加载收藏对应的发布内容,避免模板渲染时触发N+1数据库查询 ->join('f.publication', 'pub') ->addSelect('pub') // 仅筛选目标用户的收藏记录 ->where('f.user = :targetUser') ->setParameter('targetUser', $user) // 按收藏操作时间倒序,优先展示最新产生的收藏 ->orderBy('f.createdAt', 'DESC') // 限制返回结果的数量 ->setMaxResults($limit) ->getQuery() ->getResult(); }
注意:如果你的
Favorite实体中,收藏创建时间的映射属性不是createdAt(比如命名为created_at),需要把orderBy中的字段替换为实体实际定义的属性名,不要直接写数据库物理列名。
2. 调整ProfilController的业务逻辑
现有控制器中直接用findBy全量拉取用户所有收藏,既没有排序也没有数量限制,在用户收藏量较大时会产生不必要的性能开销。将原有全量查询收藏的逻辑替换为调用上面新增的仓库方法:
/** * @IsGranted("ROLE_USER") * @Route("/profil/{id}", name="profil", methods={"GET","POST"}) */ public function index(User $user, PublicationManager $publicationManager): Response { $em = $this->getDoctrine()->getManager(); // 原有查询用户发布内容的逻辑完全保留 $publications = $em->getRepository('App:Publication')->findBy( ['users' => $user->getId()], ['created_at' => 'DESC'] ); // 新增:拉取目标用户最近9条收藏 $favoriteRepository = $em->getRepository(Favorite::class); $latestFavorites = $favoriteRepository->getLatestUserFavorites($user, 9); return $this->render('profil/index.html.twig', [ 'publications' => $publications, 'mesRecettes' => $publicationManager->getRecetteByUser($user), // 把最新9条收藏传入模板,供侧边栏渲染使用 'latestFavorites' => $latestFavorites, // 原有其他模板参数全部保留,不影响现有页面逻辑 'recettes' => $publicationManager->allRecette(), 'user' => $user, 'lastRecettes' => $publicationManager->lastXRecette(), 'lastPRecettes' => $publicationManager->lastPRecette($user, 6), ]); }
注意:如果原有代码里的全量收藏列表
mesFavoris在其他区块还有使用,可以保留原有的全量查询逻辑,侧边栏仅使用新增的latestFavorites变量即可,不需要删除原有功能。
3. 侧边栏模板渲染
在个人资料页的侧边栏区块,遍历传入的latestFavorites变量,按照参考效果渲染每条收藏的缩略图、标题和跳转链接,基础模板示例:
{# 侧边栏最近收藏模块 #} <div class="sidebar-favorite-section"> <h4>最近收藏</h4> <div class="favorite-grid"> {% for favorite in latestFavorites %} <div class="favorite-item"> <a href="{{ path('publication_detail', {id: favorite.publication.id}) }}"> <img src="{{ favorite.publication.coverImage }}" alt="{{ favorite.publication.title }}"> <p>{{ favorite.publication.title }}</p> </a> </div> {% else %} <p>该用户暂无公开的收藏内容</p> {% endfor %} </div> </div>
常见踩坑提示
- 不要直接修改原有
lastXFavorite方法的入参逻辑,这个方法原本的功能是校验单条内容的收藏状态,修改后可能影响其他业务模块的正常运行。 - 排序必须使用收藏记录本身的创建时间,不能直接用关联的Publication的发布时间排序,否则展示结果会变成按内容发布时间排列,不符合“最近收藏”的逻辑。
- 如果关联的Publication存在未发布、已删除的无效状态,需要在查询中增加过滤条件(比如
->andWhere('pub.isPublished = true')),避免渲染时出现无效跳转链接。
内容的提问来源于stack exchange,提问作者Juani08224
相关产品推荐
相关产品推荐

