Laravel Eloquent实现至少2个关键词匹配的搜索结果查询
Laravel Eloquent 实现关键词至少匹配N个的搜索
要实现仅返回至少匹配2个(或3个)关键词的结果,你需要先统计每条记录匹配的关键词数量,再筛选出数量达标的结果。同时需要修正原有代码中分类筛选的逻辑错误(原循环会覆盖查询,导致仅保留最后一个分类的条件)。
解决方案代码
$categories = explode(',', $site->category); $keywords = explode(',', $site->keywords); // 构建关键词匹配计数的SQL片段与绑定参数(避免SQL注入) $matchCountSql = '0'; $keywordBindings = []; foreach ($keywords as $keyword) { $matchCountSql .= " + (CASE WHEN keywords LIKE ? THEN 1 ELSE 0 END)"; $keywordBindings[] = "%{$keyword}%"; } $results = Website::where('name', '!=', $name) // 匹配任意一个目标分类 ->where(function ($query) use ($categories) { foreach ($categories as $category) { $query->orWhere('category', 'like', "%{$category}%"); } }) // 计算每条记录匹配的关键词数量 ->selectRaw("*, {$matchCountSql} as matched_keywords_count", $keywordBindings) // 筛选至少匹配2个关键词的结果(要匹配3个就改成>=3) ->havingRaw('matched_keywords_count >= 2') ->get();
关键逻辑说明
- 分类筛选修正:将多个分类的匹配条件放入闭包中,用
orWhere组合,确保匹配任意一个分类的记录都会被纳入范围,而非仅保留最后一个分类的条件。 - 关键词匹配计数:通过
selectRaw拼接SQL的CASE WHEN语句,对每个关键词判断是否存在于keywords字段中,匹配则累加1,最终得到matched_keywords_count字段(即该记录匹配的关键词总数)。 - 结果筛选:使用
havingRaw对计算出的匹配数量进行筛选,只保留数量≥2(或自定义的N)的记录。
扩展说明
- 若需要匹配至少3个关键词,只需将
havingRaw('matched_keywords_count >= 2')中的2改为3即可。 - 代码中使用了参数绑定(
$keywordBindings),避免直接拼接字符串导致的SQL注入风险。
内容的提问来源于stack exchange,提问作者lastbencher
相关产品推荐
相关产品推荐

