Laravel JSON查询条件不区分大小写

6

我正在使用L5.2和MySQL 5.7。我在数据库中的meta列中有以下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 等查询,都将获得结果,即使只输入了部分名字或姓氏也是如此。

2个回答

6

我通过使用这种方法解决了问题。有了这个方法,我可以通过全名(名字+空格+姓)或者名字的其中一部分进行查询。我不确定这是否是最优雅的解决方案。

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等都可以获得结果。即使是部分名字也可以。


-3

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


你的回答不适用于JSON列类型,此外,在这种情况下,值“fidel”不会返回任何结果,因为查询区分大小写。 - enriqg9
如果只是一次性访问该值,最好从列中提取first_name的值。 - user6288916
请查看我的更新帖子,其中包含我想出的解决方案。 - enriqg9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接