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

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();

关键逻辑说明

  1. 分类筛选修正:将多个分类的匹配条件放入闭包中,用orWhere组合,确保匹配任意一个分类的记录都会被纳入范围,而非仅保留最后一个分类的条件。
  2. 关键词匹配计数:通过selectRaw拼接SQL的CASE WHEN语句,对每个关键词判断是否存在于keywords字段中,匹配则累加1,最终得到matched_keywords_count字段(即该记录匹配的关键词总数)。
  3. 结果筛选:使用havingRaw对计算出的匹配数量进行筛选,只保留数量≥2(或自定义的N)的记录。

扩展说明

  • 若需要匹配至少3个关键词,只需将havingRaw('matched_keywords_count >= 2')中的2改为3即可。
  • 代码中使用了参数绑定($keywordBindings),避免直接拼接字符串导致的SQL注入风险。

内容的提问来源于stack exchange,提问作者lastbencher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:40:56