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

Laravel Eloquent搜索异常:仅匹配大写产品名称,小写不生效

解决Laravel Eloquent查询无法筛选小写产品名称的问题

你遇到的核心问题是数据库LIKE查询的大小写敏感性:当前代码仅把搜索词转成小写,但数据库字段若使用了区分大小写的排序规则(比如MySQL的utf8_bin),会导致只有产品名称与转小写后的搜索词完全一致时才会被匹配到,反过来就无法命中。下面给你几个实用的解决方案:

方案1:统一转换为小写匹配(推荐,无需修改数据库)

通过whereRaw将数据库字段和搜索词都转成小写,彻底消除大小写差异,同时用参数绑定避免SQL注入风险:

$searchTerm = '%' . strtolower($searchWord) . '%';

Products::select('productName')
    ->whereRaw('LOWER(productName) LIKE ?', [$searchTerm])
    ->where('statusID', 1)
    ->orderBy('productID', 'desc')
    ->get();

这里LOWER(productName)会把数据库中的产品名称统一转为小写,再和转小写后的搜索词做模糊匹配,不管原字段是大写还是小写都能命中。

方案2:修改数据库字段排序规则(长期解决方案)

如果项目允许调整数据库结构,直接把productName字段的排序规则改成不区分大小写的类型(比如MySQL的utf8mb4_general_ci或utf8mb4_unicode_ci),之后默认的LIKE查询就会自动忽略大小写,代码可以简化成:

Products::select('productName')
    ->where('productName', 'like', '%' . $searchWord . '%')
    ->where('statusID', 1)
    ->orderBy('productID', 'desc')
    ->get();

注意:修改字段排序规则前建议备份数据,避免出现意外问题。

方案3:使用原生不区分大小写运算符(特定数据库支持)

如果你的项目用的是PostgreSQL数据库,可以直接用ILIKE代替LIKE,它原生支持不区分大小写的模糊匹配:

Products::select('productName')
    ->where('productName', 'ilike', '%' . $searchWord . '%')
    ->where('statusID', 1)
    ->orderBy('productID', 'desc')
    ->get();

不过MySQL并不原生支持ILIKE,这个方案只适合特定数据库环境。

最后提醒一句:不要直接把用户输入拼接进查询语句,你原来的写法存在SQL注入风险,上面的方案都用了参数绑定或Laravel查询构建器的安全语法,能有效规避这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:24:01