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

Laravel 5.7中DB::table如何实现大小写不敏感查询?

解决PostgreSQL下Laravel Eloquent大小写不敏感搜索问题

嘿,你遇到的这个问题其实是PostgreSQL的特性导致的——默认的LIKE操作符是区分大小写的,而MySQL里的LIKE通常不区分,所以才会出现小写能搜到、大写搜不到的情况。下面给你两种简单的解决方法:

方法一:使用PostgreSQL原生的ILIKE(推荐)

PostgreSQL专门提供了ILIKE操作符来做不区分大小写的模糊匹配,用法和LIKE完全一致,只需要替换掉代码里的LIKE即可。

修改你代码中的查询条件部分:

->where(function($query) use ($keyword){
    $query->where('element_designs.element_name', 'ILIKE', '%'.$keyword.'%')
          ->orWhere('locations.location_name', 'ILIKE', '%'.$keyword.'%')
          ->orWhere('areas.area_name', 'ILIKE', '%'.$keyword.'%')
          ->orWhere('elements.updated_at', 'ILIKE', '%'.$keyword.'%');
})

这个方法最直接,不需要额外处理字符串,PostgreSQL会自动帮你处理大小写匹配问题。

方法二:统一转换为小写(兼容多数据库)

如果你需要兼容其他数据库(比如MySQL),可以把字段值和搜索关键词都转换为小写,再用LIKE匹配:

修改后的查询条件:

->where(function($query) use ($keyword){
    $lowerKeyword = strtolower($keyword);
    $query->whereRaw('LOWER(element_designs.element_name) LIKE ?', ['%'.$lowerKeyword.'%'])
          ->orWhereRaw('LOWER(locations.location_name) LIKE ?', ['%'.$lowerKeyword.'%'])
          ->orWhereRaw('LOWER(areas.area_name) LIKE ?', ['%'.$lowerKeyword.'%'])
          ->orWhereRaw('LOWER(TO_CHAR(elements.updated_at, \'YYYY-MM-DD HH24:MI:SS\')) LIKE ?', ['%'.$lowerKeyword.'%']);
})

注意:updated_at是时间类型,需要先通过TO_CHAR转成标准字符串格式,再用LOWER()转换后匹配。

完整修改后的代码

把上述修改应用到你的原代码中,完整查询部分如下:

$items = DB::table('element_designs')
    ->join('elements', function($join){
        $join->on('element_designs.id', '=', 'elements.element_design_id')
             ->where('elements.deleted_at', null);
    })
    ->leftJoin('locations', function($join){
        $join->on('elements.location_id', '=', 'locations.id')
             ->where('locations.disable_flg', false);
    })
    ->leftJoin('areas', function($join){
        $join->on('elements.area_id', '=', 'areas.id')
             ->where('areas.disable_flg', false);
    })
    ->where('element_designs.disable_flg', false)
    ->where(function($query) use ($keyword){
        // 使用ILIKE实现大小写不敏感匹配
        $query->where('element_designs.element_name', 'ILIKE', '%'.$keyword.'%')
              ->orWhere('locations.location_name', 'ILIKE', '%'.$keyword.'%')
              ->orWhere('areas.area_name', 'ILIKE', '%'.$keyword.'%')
              ->orWhere('elements.updated_at', 'ILIKE', '%'.$keyword.'%');
    })
    ->select('element_designs.id as element_design_id', 'element_designs.doc_no', 'elements.id as element_id', 'element_designs.element_name', 'locations.location_name', 'areas.area_name', 'elements.updated_at')
    ->paginate(20);

return view('element.data', ['items' => $items]);

这样不管你输入ab、Ab还是AB,都能搜到相同的结果啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:07:53