【问题标题】:to lower case in laravel eloquent query在 laravel 雄辩的查询中小写
【发布时间】:2021-05-16 14:34:15
【问题描述】:

我正在使用model::where 将我的数据库转换为小写列数据

这是我的查询:

$restaurants = Restaurant::where('name', 'LIKE', "%".$search."%")->get();

        $results = [];

        foreach ($restaurants as $r) {
            $data = array(
                'id' => $r->id,
                'label' => $r->name,
                'value' => $r->name,
                'url' => $r->url,
            );
            array_push($results, $data);
        }

我正在处理这个:

$restaurants = Restaurant::whereRaw('LOWER(name) = ?', [$search])->get();

但返回空结果。

我怎么能做到这一点?在我的数据库中都是大写的,我需要大写或小写搜索

感谢您的帮助

【问题讨论】:

  • 您可以在将变量传递给您的语句之前使用strtolower
  • LOWER(name) LIKE ?, [ "%$search%" ] 怎么样?旁注:您是否使用区分大小写的排序规则?这些并不是很常用
  • 首先你应该检查数据库的collations,除非你有非常具体的理由来存储区分大小写的数据,否则它们应该设置为不区分大小写,这样做你不需要这种类型的大小写转换。

标签: php laravel eloquent laravel-5.8


【解决方案1】:

如果您使用 MySQL、MariaDB 或 PostgreSQL,您可以简单地使用不区分大小写的 LIKE 特殊版本:ILIKE

$restaurants = Restaurant::where('name', 'ILIKE', "%".$search."%")->get();

$results = [];

foreach ($restaurants as $r) {
    $data = array(
        'id' => $r->id,
        'label' => $r->name,
        'value' => $r->name,
        'url' => $r->url,
    );
    array_push($results, $data);
}

为了提高效率,您可以在数据库上的该字段(或表或数据库)上使用不区分大小写的排序规则,因此每次进行的比较都将不区分大小写(请注意,如果您有主要或唯一具有不区分大小写排序规则的键,您不能有多个条目具有相同的文本,只有不同的大小写)。

【讨论】:

    【解决方案2】:

    试试这个

    $restaurants = Restaurant::whereRaw('LOWER(`name`) LIKE ? ',[trim(strtolower($search)).'%']);
    

    如果它不起作用,只需在最后一个查询中添加 ->get()

    【讨论】:

      猜你喜欢
      • 2018-01-26
      • 2021-07-23
      • 2017-11-11
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      相关资源
      最近更新 更多