【问题标题】:Laravel JSON where clause case insensitiveLaravel JSON where 子句不区分大小写
【发布时间】:2016-09-03 11:32:21
【问题描述】:

我正在使用 L5.2 和 MySQL 5.7。我在数据库中的元列上有以下 JSON:

{"cellphone": "(687) 638-4512 x22934", "last_name": "Bashirian", "first_name": "Fidel"}

无论字符串是大写还是小写,我都在尝试运行以下查询:

User::where('meta->first_name', 'fidel');

我尝试过类似的方法:

User::whereRaw('LOWER(meta->"$.first_name") = ?', ['fidel']);

但这会返回 null。关于如何做到这一点的任何想法!?


我还希望能够通过全名进行查询,例如“fidel bashirian”。我尝试使用concat(),但我不确定它是否适用于 JSON 列类型,所以我最终使它与以下函数一起使用:

protected function name($name)
{
    $name = explode(' ', $name);

    foreach ($name as $key => $value) {

        $name[$key] = '%' . strtolower($value) . '%';

        $this->builder->where(function ($query) use ($name, $key) {
            $query->whereRaw('LOWER(meta->"$.first_name") like ?', [$name[$key]]);
            $query->orWhereRaw('LOWER(meta->"$.last_name") like ?', [$name[$key]]);
        });
    }

    return $this->builder;
}

通过fidelFidelFIDELfidel bashirian等查询之前的方法都会得到结果。即使有部分名字或姓氏。

【问题讨论】:

    标签: mysql json laravel


    【解决方案1】:

    我用这个方法解决了。有了这个,我可以通过全名(名字+''+姓氏)或名字或姓氏进行查询。我不确定这是否是最优雅的解决方案。

    protected function name($name)
    {
        $name = explode(' ', $name);
    
        foreach ($name as $key => $value) {
    
            $name[$key] = '%' . strtolower($value) . '%';
    
            $this->builder->where(function ($query) use ($name, $key) {
                $query->whereRaw('LOWER(meta->"$.first_name") like ?', [$name[$key]]);
                $query->orWhereRaw('LOWER(meta->"$.last_name") like ?', [$name[$key]]);
            });
        }
    
        return $this->builder;
    }
    

    通过fidelFidelFIDELfidel bashirian等查询之前的方法都会得到结果。即使有部分名字或姓氏。

    【讨论】:

      【解决方案2】:

      应该是这样的 用户::where('first_name', 'fidel'); 第一个表示对象的属性,第二个表示匹配值

      【讨论】:

      • 您的答案不适用于 JSON 列类型,除了这种情况下的值 'fidel' 不会返回任何结果,因为查询区分大小写。
      • 如果您可以从列中提取 first_name 值,如果它只是一次访问该值,那就更好了。
      • 用我想出的解决方案检查我更新的帖子。
      猜你喜欢
      • 2021-02-27
      • 2020-12-06
      • 2014-10-19
      • 2016-11-26
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2017-06-21
      • 2014-02-15
      相关资源
      最近更新 更多