Laravel大小写不敏感搜索问题:搜索water需返回WATER结果
实现大小写不敏感的搜索问题
你希望搜索“water”时能返回包含“WATER”的结果,但当前代码无法实现,你的代码如下:
$value = "water"; $categories = Category::where(DB::raw('LOWER(`title`)'), 'like', '%' . Str::lower($value) . '%')->get();
解决方案
以下几种方法可以实现大小写不敏感的搜索:
利用数据库默认不区分大小写的排序规则
如果你的categories表title字段使用的是utf8mb4_general_ci或utf8mb4_unicode_ci这类不区分大小写的排序规则(MySQL默认通常为这类),可以直接简化查询,无需手动转换大小写:$value = "water"; $categories = Category::where('title', 'like', "%{$value}%")->get();针对区分大小写的排序规则优化查询
如果数据库使用的是utf8mb4_bin这类区分大小写的排序规则,你可以保持大小写转换逻辑,改用更简洁的whereRaw写法:$value = "water"; $categories = Category::whereRaw('LOWER(title) LIKE ?', ["%".Str::lower($value)."%"])->get();也可以通过指定
COLLATE强制使用不区分大小写的规则查询:$value = "water"; $categories = Category::where('title', 'like', "%{$value}%")->collate('utf8mb4_general_ci')->get();
排查当前代码未生效的可能原因
如果数据库排序规则是区分大小写的,当前代码理论上应该能生效(因为将字段和搜索值都转为了小写),若仍无结果,可检查:
title字段是否确实包含“WATER”或其他大小写形式的目标字符串- 数据库连接的字符集设置是否正确,避免转换过程中出现编码问题
内容的提问来源于stack exchange,提问作者Babak Rostami
相关产品推荐
相关产品推荐

