【问题标题】:Laravel Eloquent Ignore CasingLaravel Eloquent 忽略大小写
【发布时间】:2014-02-08 09:53:27
【问题描述】:

我正在尝试使用 Eloquent 运行查询 $vars['language'] 是小写的,但语言列不一定是小写的。我如何使用 eloquent 进行此搜索,但查询中仍有小写字母

Item::where('language', $vars['language'])

我想做的是这个,即使我在任何地方都找不到如何做到这一点

Item::where('LOWER(language)', $vars['language'])

这样它们都是小写的,然后我可以让它们匹配。

【问题讨论】:

  • 使用 DB:raw() 来使用 LOWER()

标签: mysql orm laravel eloquent lowercase


【解决方案1】:

将 whereRaw 与 parameter binding 一起使用来清理您的 whereRaw 语句:

$term = strtolower($vars['language']);
Item::whereRaw('lower(language) like (?)',["%{$term}%"])->get();

上一个答案 在某些数据库中,您可以在 where 中使用运算符 ilike。例如

Item::where('language', 'ilike', $vars['language'])->get();

所有可用的运算符是:

protected $operators = array(
    '=', '<', '>', '<=', '>=', '<>', '!=',
    'like', 'not like', 'between', 'ilike',
    '&', '|', '^', '<<', '>>',
);

编辑:ilike 不区分大小写 like。

【讨论】:

  • 嘿,什么是 ilike,它有什么作用?
  • ilike 像 postgres 一样不区分大小写
  • 所以你的意思是like 是不区分大小写的运算符?
  • like 与区分大小写有什么关系?
  • 您从哪里获得运营商列表? regex 也应该包含在内。
【解决方案2】:

根据this post,解决此问题的独立于数据库的方法是:

Item::whereRaw('LOWER(language) = ?', [$vars['language']])->get();

【讨论】:

    【解决方案3】:

    如果您正在尝试寻找基于 laravel 的解决方案,filter() 收集方法会很有用:

    // $this refers to an instance of an eloquent User Model
    $name = 'BiLbo baGGings';    
    return $this->contactInformation->filter(function($value, $key) use($name) { 
       if(strtolower($value->name) == strtolower($name)) {
           return $value;
       }
     });
    

    【讨论】:

    • 这不是 eagler-loading! 'with' 方法在哪里?使用 $this->contactInformation 您正在将所有联系人信息加载到内存中,然后进行过滤。打击内存而不是数据库级别总是最糟糕的选择:/
    • 你说得对,我把我的答案不正确的部分删掉了,以免让其他读者感到困惑。
    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多