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;
通过fidel
、Fidel
、FIDEL
、fidel 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;
通过fidel
、Fidel
、FIDEL
、fidel bashirian
等查询之前的方法都会得到结果。即使有部分名字或姓氏。
【讨论】:
【参考方案2】:应该是这样的 用户::where('first_name', 'fidel'); 第一个表示对象的属性,第二个表示匹配值
【讨论】:
您的答案不适用于 JSON 列类型,除了这种情况下的值 'fidel' 不会返回任何结果,因为查询区分大小写。 如果您可以从列中提取 first_name 值,如果它只是一次访问该值,那就更好了。 用我想出的解决方案检查我更新的帖子。以上是关于Laravel JSON where 子句不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章
在 where 子句 laravel 中使用 Json 属性