Laravel查询构建器:用first()/find()获取单篇帖子回复数是否可行?
你的实现方式可行,但需要补充分组逻辑
你的代码思路是对的:通过左连接关联replies表,用COUNT(replies.id)统计回复数,最后用first()获取单条帖子数据,完全符合你不用get()的要求。
但存在一个潜在问题:缺少GROUP BY子句。因为使用了聚合函数COUNT(),在多数数据库的严格模式下,SELECT中未被聚合的字段(比如posts.id、posts.title等)必须出现在GROUP BY里,否则会抛出语法错误。
修正后的代码应该加上->groupBy('posts.id'):
$post = DB::table('posts') ->leftJoin('replies', 'posts.id', '=', 'replies.post_id') ->select( 'posts.id', 'posts.slug', 'posts.title', 'posts.body', 'posts.created_at', DB::raw('COUNT(replies.id) AS total_replies') ) ->where('posts.id', $postId) // 注意避免变量名冲突,建议将查询条件变量改为$postId ->groupBy('posts.id') ->first();
另外注意:你的原代码里where('posts.id', $post->id)存在变量名冲突——你正在给$post赋值,却又用$post->id作为查询条件,这会直接导致报错,建议把查询条件的变量改成比如$postId。
如果你的Laravel版本支持,也可以用更简洁的selectRaw替代DB::raw:
->selectRaw('posts.*, COUNT(replies.id) AS total_replies')
这样既保留了用first()获取单条数据的需求,又保证了查询的合法性和正确性。
内容的提问来源于stack exchange,提问作者Yokas Carbon
相关产品推荐
相关产品推荐

