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

Laravel从pivot中间表获取最新提问下评论的点赞数及点赞用户数据

问题分析与解决方案

原有代码问题

  • user_like_byId方法逻辑错误:方法内where('id',$id)没有指定表名,会默认匹配users表的id,而你传入的是评论id,导致查询结果错误/报错,且这个方法本身属于冗余逻辑,现有users_like关联已经能满足需求
  • 存在严重的N+1查询问题:循环内每次调用user()、单独查询点赞数据都会重复触发数据库请求,数据量大时性能极差
  • 最新ask查询写法冗余:get()->first()会先查询全表的ask数据再取第一条,直接调用first()即可

实现步骤

第一步:清理冗余代码

删除Comment模型中错误的user_like_byId方法,保留原有users_like关联即可。

第二步:用预加载方式查询数据(避免N+1)

// 一次性查询最新ask、关联评论、评论发布用户、点赞用户,同时统计每条评论的点赞数
$ask = Ask::query()
    ->latest('id')
    ->with([
        'comments' => function ($query) {
            // 统计点赞总数,追加like_count属性到评论模型
            $query->withCount('users_like as like_count')
                  // 预加载评论的发布用户、所有点赞用户
                  ->with(['user', 'users_like']);
        }
    ])
    ->first();

第三步:遍历输出数据

foreach ($ask->comments as $commentItem) {
    echo "评论id: ".$commentItem->id .'<br>';
    echo "评论发布者名称 :" .$commentItem->user->name . "<br>";
    echo "评论内容 :" .$commentItem->text . "<br>";
    echo "点赞总数 :" .$commentItem->like_count . "<br>";
    echo "点赞用户列表:<br>";
    foreach ($commentItem->users_like as $likeUser) {
        echo "- " . $likeUser->name . "<br>";
    }
    echo "<hr>";
}

核心优化说明

  • withCount('users_like')是Laravel原生提供的关联统计方法,会自动计算每条评论的点赞数,不用手动写统计逻辑
  • 预加载机制只需要4次数据库查询就能拿到全部所需数据,比原有循环内查库的写法性能提升数十倍
  • 直接用动态属性$commentItem->user即可拿到关联的用户模型,不需要调用user()查询构造器再手动取字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:12:03