You need to enable JavaScript to run this app. Symfony如何获取指定用户最近9条收藏内容
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 20:36:07