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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:29:53