查询未收藏对应帖子却点赞其评论的用户ID问题求助
问题分析与解决方案
你的查询存在两个核心问题:
- 表关联顺序错误,导致
comments表的数据无法正确关联到bookmarks表 - 未关联
bookmarks与likes的user_id,导致你过滤的是所有用户都没收藏该帖子的情况,而非点赞的用户自身没收藏该帖子
另外,你的需求是针对「某特定帖子」,所以还需添加目标帖子ID的过滤条件。
正确的Laravel查询构建器代码
$targetPostId = 1; // 替换为你要查询的特定帖子ID Like::join('comments', 'likes.comment_id', '=', 'comments.id') ->where('comments.post_id', $targetPostId) ->leftJoin('bookmarks', function ($join) use ($targetPostId) { $join->on('bookmarks.user_id', '=', 'likes.user_id') ->where('bookmarks.post_id', $targetPostId); }) ->whereNull('bookmarks.id') // 用主键判断收藏记录是否存在更可靠 ->distinct() // 去重,避免同一用户多次点赞导致重复ID ->pluck('likes.user_id');
对应的SQL语句
SELECT DISTINCT likes.user_id FROM likes JOIN comments ON likes.comment_id = comments.id LEFT JOIN bookmarks ON bookmarks.user_id = likes.user_id AND bookmarks.post_id = 1 WHERE comments.post_id = 1 AND bookmarks.id IS NULL;
关键修正点说明
- 调整关联顺序:先通过
JOIN关联comments,确保只保留点赞了目标帖子下评论的有效记录 - 关联用户维度:在关联
bookmarks时同时绑定user_id和post_id,精准检查点赞用户自身是否收藏了该帖子 - 锁定特定帖子:添加
comments.post_id = 目标ID条件,聚焦到你要查询的帖子范围 - 去重处理:用
distinct()避免同一用户多次点赞该帖子下评论,导致返回重复的用户ID - 可靠判断收藏状态:用
bookmarks.id IS NULL代替post_id,主键的非空约束能更准确判断是否存在收藏记录
内容的提问来源于stack exchange,提问作者Yemi A
相关产品推荐
相关产品推荐

