Laravel JSON where 子句不区分大小写

Posted

技术标签:

【中文标题】Laravel JSON where 子句不区分大小写【英文标题】:Laravel JSON where clause case insensitive 【发布时间】: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等查询之前的方法都会得到结果。即使有部分名字或姓氏。

【问题讨论】:

【参考方案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 值,如果它只是一次访问该值,那就更好了。 用我想出的解决方案检查我更新的帖子。

以上是关于Laravel JSON where 子句不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 7 / SQL不区分大小写的where子句

在 where 子句 laravel 中使用 Json 属性

Laravel 查询不使用 where 子句作为日期

字符串属性的 gql 查询中不区分大小写的 where 子句

多个where子句,Laravel

Laravel关系列'id'在where子句中不明确