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

