Laravel中如何对关联表字段执行WHERE LIKE查询并统计数据?
解决方法
要实现按关键词统计对应location下包含该关键词的评论数量,你需要调整查询的关联条件、添加分组逻辑,同时修正字段名的小错误,完整代码如下:
DB::table('keywords') ->select('keywords.keys as key', DB::raw('COUNT(comments.id) as count')) // 使用左连接确保所有关键词都被统计,无匹配评论时count为0 ->leftJoin('comments', function($join) { $join->on('comments.location_id', '=', 'keywords.location_id') // 匹配评论内容包含当前关键词的记录 ->whereRaw('comments.comment LIKE CONCAT("%", keywords.keys, "%")'); }) // 按关键词分组,保证每个关键词对应一条统计结果 ->groupBy('keywords.id', 'keywords.keys') ->get();
关键说明:
- 修正字段名:你的表结构里关键词字段是
keys,不是key,所以查询里要写keywords.keys,并通过as key对齐期望的输出字段 - 采用
leftJoin替代普通join:如果某个关键词在对应location下没有匹配的评论,依然会保留该关键词的记录,统计数为0 - 关联条件同时过滤location和关键词匹配:在join的闭包内同时指定
location_id关联和评论包含关键词的条件,避免后续额外过滤带来的性能损耗 - 分组逻辑:必须按关键词的唯一标识(
id)和keys分组,确保每个关键词的统计结果独立
可选优化:
如果需要精确匹配单词(比如避免"sample"匹配"samples"),可以把LIKE替换为正则表达式(以MySQL为例):
->whereRaw('comments.comment REGEXP CONCAT("[[:<:]]", keywords.keys, "[[:>:]]")')
内容的提问来源于stack exchange,提问作者TheGPWorx
相关产品推荐
相关产品推荐

