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
相关产品推荐
相关产品推荐

