You need to enable JavaScript to run this app. Laravel Eloquent使用where like做多值模糊匹配无结果问题求解
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Eloquent使用where like做多值模糊匹配无结果问题求解

问题原因

原有代码失效的核心原因是:你将多个系统名称拼接为完整的逗号分隔字符串后直接用like查询,要求数据库systemes字段必须包含完全一致的连续拼接序列才能命中结果。比如当数组为['windows','linux']时,生成的查询条件是like '%windows,linux%',只有字段内容恰好按windows,linux的顺序连续存储时才能匹配,若字段存储的是linux,windows、windows,ios,linux这类内容都会匹配失败,因此多元素时无返回结果。


解决方案

方案1:使用FIND_IN_SET精准匹配(推荐)

如果你的systemes字段是用逗号分隔存储多系统值,用MySQL内置的FIND_IN_SET函数可以避免部分匹配、顺序不匹配的问题,直接判断单个系统是否在逗号分隔的列表中:

// 直接使用原数组$ch构建查询,无需提前implode为字符串
$vpns = Vpns::where(function ($query) use ($ch) {
    foreach ($ch as $systemItem) {
        // 匹配任意一个系统存在就命中
        $query->orWhereRaw('FIND_IN_SET(?, systemes)', [$systemItem]);
    }
})->get();

如果需要查询同时包含所有数组内系统的结果,把orWhereRaw改为whereRaw即可。

方案2:多like条件匹配

如果你确实需要模糊匹配,不需要完全匹配系统名称,可以改用多orWhere拼接like条件:

$vpns = Vpns::where(function ($query) use ($ch) {
    foreach ($ch as $systemItem) {
        $query->orWhere('systemes', 'like', "%{$systemItem}%");
    }
})->get();

优化建议

从数据库设计规范角度,不建议用单个字段存储逗号分隔的多值数据,你可以新增系统关联表,用多对多关系存储VPN支持的系统,后续查询效率和可维护性会更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 02:06:09