【问题标题】:How to search case insensitive in Eloquent model如何在 Eloquent 模型中搜索不区分大小写
【发布时间】:2019-01-01 00:47:27
【问题描述】:

我想在 Eloquent 模型中搜索不区分大小写。

现在我正在使用这个

Model::where($column, 'LIKE', '%' . $value . '%' ); 

但它区分大小写。我该如何解决这个问题?

我也找到了这个帖子How can I search (case-insensitive) in a column using LIKE wildcard?,但我不能在 Eloquent 模型中使用它

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    其实你不需要使用UPPER,只需使用ilike作为比较器,它会进行不区分大小写的比较。

    Model::where('column', 'ilike', '%' . $value . '%')
    

    确实需要% 符号来表示您正在搜索的子字符串。

    【讨论】:

    • 这不适用于 MySQL,因为它不支持 ILIKE
    • 在我的 PostgreSQL 服务器上工作。
    • 这仅适用于 PostgreSQL,但不适用于 MySQL
    【解决方案2】:

    在这种情况下我建议使用 Upper 函数

    Model::whereRaw("UPPER('{$column}') LIKE '%'". strtoupper($value)."'%'"); 
    

    喜欢这个

    【讨论】:

    • 我认为你有一个额外的 dot 和额外的单引号,即它应该是 Model::whereRaw("UPPER('$column') LIKE '%".strtoupper( $value)."%'");
    • 好像不安全
    • @id614515 有人可以详细说明,为什么它不安全以及如何改进?
    • @Origami1024 这并不安全,因为它容易受到 SQL 注入的影响。您应该像这样使用参数绑定:Model::whereRaw('UPPER('{$column}') LIKE ?', ['%' . strtoupper($value) . '%']);
    【解决方案3】:

    没有看到这个解决方案。所以我把这个贴在这里。

    DB::table('products')
       ->select('productid')                
       ->where(DB::raw('lower(product)'), 'like', '%' . strtolower($searchword) . '%')
       ->get();
    

    【讨论】:

      【解决方案4】:

      这应该可行。

      替换column$text

      $model = Models::whereRaw( 'LOWER(`column`) LIKE ?', [ $text ] )->first();
      

      【讨论】:

        【解决方案5】:

        您的表格排序规则是什么?

        这是您数据库中排序规则的特殊性,请尝试使用 latin_general_cilatin_gerneral_cs,它们是不区分大小写的。

        但是,如果您试图通过示例在 utf8_bin 中获取此内容,则它不会运行,因为此排序规则很敏感。

        所有示例都在 MySql 下运行。

        【讨论】:

        • 我正在使用utf8_bin,但我不会更改它
        • 所以,我相信不可能进行这种搜索,限制将在您的表格排序选择中,任何类型的代码切换都会影响这种特殊性。我还没有尝试过,但是您可以在数据库和数据库配置 PHP 文件上创建另一个连接,并在该数组中设置 'collat​​ion' => 'utf8_general_ci'。
        • 谢谢你。我不知道如果我的表是utf8_unicode_ci,“ci”表示它不区分大小写,所以我不需要在这里使用ilike或其他方法。 dba.stackexchange.com/a/8031/18098
        【解决方案6】:

        Laravel eloquent 搜索不区分大小写,查询中不需要 ilike、upper 或 lower 函数。

        只需使用:

        Controller::query()
            ->where('column1_name', 'LIKE', "%{$search}%") 
            ->orWhere('column2_name', 'LIKE', "%{$search}%") 
            ->orWhere('column3_name', 'LIKE', "%{$search}%") 
            ->get();
        

        orWhere 部分是为了防止您有多个要查询的表字段

        【讨论】:

        • 嗯,这就是我现在正在使用的。而且效果很好
        • "Like" 运算符在某些情况下区分大小写,而在其他情况下则不区分大小写,根据 db 排序规则,请参阅 dev.mysql.com/doc/refman/5.7/en/…
        • 我不知道如何向您展示我正在处理的内容的屏幕截图。我的意思是,我也很惊讶它在 Laravel 中工作而无需比较案例。我希望你明白我想说什么。
        【解决方案7】:

        您不必将关键字和 DB 值都转换为相同的大小写(大写或小写)。相反,您可以简单地指定“iLIKE”而不是“LIKE”。以下示例根据 category_id 以及关键字是否匹配名字或姓氏返回模型数据列表:

        $transactions = Transaction::where('category_id', $category_id);
        $transactions = $transactions->where(function ($q) use($keyword) {               
            $q->where('firstName', 'iLIKE', '%'.$keyword.'%');
            $q->orwhere('lastName', 'LIKE', '%'.$keyword.'%');
        });
        

        【讨论】:

          【解决方案8】:

          已回答使用iLike 运算符,它不区分大小写,请参阅

          Laravel Eloquent Ignore Casing

          或者为了好玩,不推荐这样做..

          // prepare two variants of the same value ?
          // first to uppercase
          // second to lowercase
          
          $valueUp    = strtoupper($value);
          $valueLower = strtolower($value);
          
          Model::where($column, 'LIKE', '%' . ($valueUp || $valueLower) . '%' ); 
          

          没有测试它,但这就是获胜的想法..

          【讨论】:

          • 这行不通。如果DB记录由大写字母和小写字母组成
          • 那么数据库设计将是一个设计不佳的数据库,在插入数据库之前准备内容,编程中没有什么是自动的。在插入该特定记录之前准备查询]
          • 您的数据库中有名为“John”的用户。当用户搜索“jo”时,您希望获得此记录。在这种情况下你将如何设计数据库?
          • ($valueUp || $valueLower) => 是 true .. 所以你的查询是:'LIKE', '%true%' )....
          • 所以?你是怎么做到的?
          猜你喜欢
          • 2011-01-14
          • 2012-06-06
          • 2018-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多